Pagini recente » Cod sursa (job #2905320) | Cod sursa (job #243270) | Cod sursa (job #2049783) | Cod sursa (job #2110978) | Cod sursa (job #234652)
Cod sursa(job #234652)
#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=1<<30,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;dad[i]=0;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;}
if(!ok)return 0;
viz[nod_best]=1;if(nod_best==t)return 1;
for(i=s;i<=t;i++)
if(!viz[i])
if(cap[nod_best][i]-flow[nod_best][i])
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]]--;
}
}