Pagini recente » Cod sursa (job #2646090) | Cod sursa (job #2831836) | Cod sursa (job #1048803) | Cod sursa (job #1676791) | Cod sursa (job #3628)
Cod sursa(job #3628)
//(c)Mircea Dima
#include <cstdio>
#include <string>
#define oo 0x3f3f3f3f
#define maxn 128
int cost[2*maxn][2*maxn], c[2*maxn][2*maxn],n, sursa, dest;
void citire()
{
freopen("cc.in", "r", stdin);
scanf("%d\n", &n);
int i, j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
int p;
scanf("%d ", &p);
cost[i][j+n]=p;
cost[j+n][i]=-p;
c[i][j+n]=1;
}
sursa=0;
dest=2*n+1;
for(i=1;i<=n;i++) cost[sursa][i]=0, c[sursa][i]=1;
for(i=n+1;i<=n<<1;i++) cost[i][dest]=0, c[i][dest]=1;
}
int bellman()
{
int d[2*maxn], t[2*maxn], i, j, ok;
memset(d, oo, sizeof(d));
memset(t, 0, sizeof(t));
d[0]=0;
ok=1;
while(ok)
{
ok=0;
for(i=sursa;i<=dest;i++)
if(d[i]!=oo)
for(j=sursa;j<=dest;j++)
if(c[i][j])
if(d[i]+cost[i][j]<d[j])
{
d[j]=d[i]+cost[i][j];
t[j]=i;
ok=1;
}
}
if(t[dest]==0)return 0;
i=dest;
while(i)
{
c[t[i]][i]=0;
c[i][t[i]]=1;
i=t[i];
}
return 1;
}
void max_flow()
{
while(bellman());
}
void afis()
{
int sum=0, i, j;
for(i=1;i<=n;i++)
{
for(j=n+1;j<=n<<1;j++)if(c[i][j]==0 && cost[i][j]!=oo) { sum+=cost[i][j]; break;}
}
/*
for(i=1;i<=n;i++)
{
for(j=n+1;j<=2*n;j++) printf("%d ", c[i][j]);
printf("\n");
}
*/
freopen("cc.out", "w", stdout);
printf("%d\n", sum);
}
int main()
{
citire();
max_flow();
afis();
return 0;
}