Cod sursa(job #46731)

Utilizator blasterzMircea Dima blasterz Data 2 aprilie 2007 21:46:09
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <cstdio>
#include <string>
#define maxn 256
int N, G[maxn][maxn], l[maxn], r[maxn];
int p[maxn], cr[maxn], cc[maxn], vr[maxn], vc[maxn];

void find_zero()
{
	int i, j, min, t;
	for(min=1<<30, i=1;i<=N;++i) if(!cr[i])
	for(j=1;j<=N;++j) if(!cc[j]) min<?=G[i][j]+vr[i]-vc[j];
	for(i=1;i<=N;++i) if(cr[i]) vr[i]+=min;
	for(j=1;j<=N;++j) if(!cc[j]) vc[j]+=min;
	for(i=1;i<=N;++i) if(!cr[i])
		for(j=1;j<=N;++j) if(!cc[j] && G[i][j] + vr[i]==vc[j])
			if(r[i])
			{
				p[i]=j, cr[i]=1, cc[r[i]]=0;
				break;
			}
			else
			{
				do t=l[j], r[i]=j, l[j]=i, i=t, j=p[i]; while(t);
				return ;
			}
	find_zero();
}


int main()
{
	freopen("cc.in", "r", stdin);
	int i, j, min, cnt;
	scanf("%d\n", &N);
	for(i=1;i<=N;++i)
		for(j=1;j<=N;++j) scanf("%d ", &G[i][j]);
	
	for(cnt=0;cnt<N;++cnt)
	{
		memset(cr, 0, sizeof(cr));
		memset(p, 0, sizeof(p));
		memcpy(cc, l, sizeof(cc));
		find_zero();
	}
	freopen("cc.out", "w", stdout);
	int sum=0;
	for(i=1;i<=N;i++) sum+=G[i][r[i]];
	printf("%d\n", sum);
	return 0;
}