| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
why wa?#include <iostream>
using namespace std;
const int N = 300;
const int MAX = 500000;
int K, C, M;
int dis[N][N];
void read()
{
scanf("%d%d%d", &K, &C, &M);
int i, j;
for(i=1; i<=K+C; i++)
for(j=1; j<=K+C; j++)
{
scanf("%d", &dis[i][j]);
if( dis[i][j] == 0 ) dis[i][j] = MAX;
}
}
void dijkstra( int p, int n)
{
bool vis[N];
memset(vis, false, sizeof(vis));
vis[p] = true;
int i, minn, loc;
while( true )
{
minn = MAX;
for(i=1; i<=n; i++)
if( !vis[i] && dis[p][i] < minn)
{
minn = dis[p][i];
loc = i;
}
if( minn == MAX) return;
vis[loc] = true;
for(i=1; i<=n; i++)
if( !vis[i] && dis[p][i] > minn + dis[loc][i])
dis[p][i] = minn + dis[loc][i];
}
}
void Dijkstra()
{
for(int i=1; i<=K; i++)
dijkstra(i, K+C);
}
bool a[N][N], used[N];
int n, m;
int b[N];
bool find( int now )
{
int i, j;
for(i=1; i<=m; i++)
if( !used[i] && a[now][i] )
{
used[i] = true;
j = b[i];
b[i] = now;
if(j == -1 || find(j) ) return true;
b[i] = j;
}
return false;
}
bool match()
{
int i;
memset(b, -1, sizeof(b));
for(i=1; i<=n; i++)
{
memset(used, false, sizeof(used));
// fill(vis, vis + m + 1, false);
if( !find(i) ) return false;
}
return true;
}
bool judge( int mid )
{
int i, j, k;
memset(a, false, sizeof(a));
for(i=1; i<=K; i++)
for(j=K+1; j<=C+K; j++)
if(dis[i][j] <= mid)
{
for(k=1; k<=M; k++)
a[ j-K ][ (i-1) * M + k ] = true;
}
n = C;
m = M*K;
// cout<<mid<<endl;
// for(i=1; i<=n; i++, cout<<endl) for(j=1; j<=m; j++) cout<<a[i][j]<<' ';
return match();
}
int get_value()
{
int left = 1, right = MAX, mid;
while( left < right )
{
mid = (left + right)/2;
if( judge (mid) ) right = mid;
else left = mid + 1;
}
return right;
}
void floyd()
{
int n = K + C;
for( int k=1; k<=n; k++)
for( int i=1; i<=n; i++)
for( int j=1; j<=n; j++)
if( dis[i][j] > dis[i][k] + dis[k][j]) dis[i][j] = dis[i][k] + dis[k][j];
}
int main()
{
read();
floyd();
// Dijkstra();
// for(int i=1; i<=K; i++, cout<<endl) for(int j=K+1; j<=K+C; j++) cout<<dis[i][j]<<' ';
printf("%d\n", get_value());
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator