Pagini recente » Cod sursa (job #1618711) | Cod sursa (job #1046341) | Cod sursa (job #1296881) | Cod sursa (job #2918275) | Cod sursa (job #234649)
Cod sursa(job #234649)
#include <stdio.h>
#define N 500
int n,c[N][N],cap[N][N],s,t,i,j,sol,min_path(),viz[N],cc[N],
inf=10000,ok,cost,nod_best,dad[N],flow[N][N];
void readd(),flux(),actualizare();
int main()
{
readd();
flux();
return 0;
}
void readd()
{ freopen("cc.in","r",stdin);
freopen("cc.out","w",stdout);
scanf ("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{ scanf ("%d",&c[i][n+j]);
c[n+j][i]=-c[i][n+j];
cap[i][j+n]=1;
}
}
void flux()
{ s=0;t=2*n+1;
for(i=1;i<=n;i++)cap[s][i]=1;
for(i=1;i<=n;i++)cap[i+n][t]=1;
while(min_path())actualizare();
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(flow[i][j+n])sol+=c[i][j+n];
printf("%d",sol);
}
int min_path()
{
//determina drum minim de la sursa la terminal
for(i=s;i<=t;i++)viz[i]=0;
for(i=s;i<=t;i++)cc[i]=inf;cc[0]=0;
ok=1;
while(ok)
{ cost=inf;ok=0;
for(i=s;i<=t;i++)
if(!viz[i])
if(cc[i]<cost)
{ nod_best=i;cost=cc[i];ok=1;}
viz[nod_best]=1;if(nod_best==t)break;
for(i=s;i<=t;i++)
if(!viz[i])
if(cap[nod_best][i]-flow[nod_best][i]>0)
if(cost+c[nod_best][i]<cc[i])
{ cc[i]=cost+c[nod_best][i];
dad[i]=nod_best;
}
}
return viz[t];
}
void actualizare()
{
for(i=t;i!=dad[i];i=dad[i])
{ flow[dad[i]][i]++;
flow[i][dad[i]]--;
}
}