Pagini recente » Cod sursa (job #563932) | Cod sursa (job #127438) | Cod sursa (job #2131528) | Cod sursa (job #1737857) | Cod sursa (job #3186555)
#include<stdio.h>
#include<string.h>
int n, f[256][256], a[256][256], dist[256], pred[256];
int bellman()
{
memset(pred, -1, sizeof(pred));
memset(dist, 0x3f3f, sizeof(dist));
dist[0]=0;
pred[0]=0;
int i, j, ok=1;
while(ok) {
ok=0;
for(i=0; i<=2*n+1; ++i)
for(j=0; j<=2*n+1; ++j) if( f[i][j]>0 && dist[j] > dist[i]+ a[i][j]) {
dist[j]=dist[i] + a[i][j];
pred[j]=i;
ok=1;
}
}
if( pred[2*n+1] ==-1) return 0;
return 1;
}
void flux()
{
int i, j;
for(i=1; i<=n; ++i) f[0][i]=f[n+i][2*n+1]=1;
while( bellman()) {
int p= 2*n+1;
while(p) {
f[pred[p]][p] = -1;
f[p][pred[p]] = +1;
p=pred[p];
}
}
int sum=0;
for(i=1; i<=n; ++i) for(j=n+1; j<=2*n; ++j) if( !f[i][j]) sum+= a[i][j];
printf("%d\n",sum);
}
int main()
{
freopen("cc.in","r",stdin);
scanf("%d",&n);
for(int i=1; i<=n; ++i)
for(int j=1; j<=n; ++j) {
scanf("%d",&a[i][j+n]);
a[j+n][i]= -a[i][j+n];
f[i][j+n]= 1;
f[j+n][i]=-1;
}
freopen("cc.out","w",stdout);
flux();
return 0;
}