Pagini recente » Cod sursa (job #2675565) | Cod sursa (job #114663) | Cod sursa (job #2805681) | Cod sursa (job #2266658) | Cod sursa (job #46735)
Cod sursa(job #46735)
#include <cstdio>
#include <string>
#define maxn 128
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;
}