Pagini recente » Cod sursa (job #3258825) | Cod sursa (job #847076) | Cod sursa (job #1386705) | Cod sursa (job #3204016) | Cod sursa (job #5314)
Cod sursa(job #5314)
#include<stdio.h>
#define maxn 500
#define inf 1e9
int co[maxn],a[maxn][maxn],i,n,j,k;
int f[maxn][maxn],c[maxn][maxn],pr[maxn];
int d,s,x,x1;
void init()
{
co[0]=0;
for(i=1;i<=2*n+1;i++)
{
pr[i]=0;
co[i]=inf;
}
}
int dr()
{
int i,j,k,ver=1;
init();
for(i=0;i<=2*n+1;i++)
{
ver=1;
for(j=0;j<=2*n+1;j++)
for(k=0;k<=2*n+1;k++)
if (c[j][k]-f[j][k]>0)
{
if (f[j][k]<0)
{
if (co[k]>co[j]+f[j][k]*a[j][k])
{
co[k]=co[j]+f[j][k]*a[j][k];
pr[k]=j;
ver=0;
}
}
else
{
if (co[k]>co[j]+(c[j][k]-f[j][k])*a[j][k])
{
co[k]=co[j]+(c[j][k]-f[j][k])*a[j][k];
pr[k]=j;
ver=0;
}
}
}
if (ver==1) break;
}
for(i=1;i<=2*n+1;i++)
if (co[d]<co[pr[d]]||co[d]==inf) return 0;
return d;
}
int main()
{
freopen("cc.in","r",stdin);
freopen("cc.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=n+1;j<=2*n;j++)
{
scanf("%d",&a[i][j]);
if (a[i][j]==0) a[i][j]=inf;
a[j][i]=a[i][j];
}
s=0;
d=2*n+1;
for(i=1;i<=n;i++)
for(j=n+1;j<=2*n;j++)
{
c[i][j]=1;
}
for(i=1;i<=n;i++)
{
c[0][i]=1;
c[n+i][2*n+1]=1;
}
x=1;
while (x!=0)
{
x=dr();
x1=x;
while(x)
{
f[x][pr[x]]--;
f[pr[x]][x]++;
x=pr[x];
}
x=x1;
}
int sum=0;
for(i=1;i<=2*n+1;i++)
for(j=1;j<=2*n+1;j++)
if (f[i][j]>0)sum+=f[i][j]*a[i][j];
printf("%d",sum);
return 0;
}