Pagini recente » Cod sursa (job #3212398) | Cod sursa (job #287374) | Cod sursa (job #780742) | Cod sursa (job #350408) | Cod sursa (job #243452)
Cod sursa(job #243452)
#include <stdio.h>
#define N 410
#define inf 1000000
int n,s,d,sol,u,v,ok,cap[N][N],flow[N][N],cost[N][N],T[N],C[N];
void readd(),flux(),update(),prints();
int dr_min();
int main()
{
readd();
flux();
prints();
return 0;
}
void readd()
{
freopen("cc.in","r",stdin);
freopen("cc.out","w",stdout);
scanf ("%d",&n);s=0;d=2*n+1;
for(u=s;u<=d;u++)
for(v=s;v<=d;v++)
cost[u][v]=inf;
for(u=1;u<=n;u++){cost[s][u]=cost[u][s]=0;cap[s][u]=1;}
for(u=n+1;u<d;u++){cost[u][d]=cost[d][u]=0;cap[u][d]=1;}
for(u=1;u<=n;u++)
for(v=n+1;v<d;v++)
{ scanf("%d",&cost[u][v]);cap[u][v]=1;cost[v][u]=-cost[u][v];}
}
void flux()
{ while(dr_min())update();
}
int dr_min()
{ for(u=s;u<=d;u++){T[u]=-1;C[u]=inf;}
C[s]=0;
ok=1;
while(ok)
{ ok=0;
for(u=s;u<=d;u++)
if(C[u]<inf)
for(v=s;v<=d;v++)
if(cap[u][v]-flow[u][v])
if(C[u]+cost[u][v]<C[v])
{ ok=1;T[v]=u;C[v]=C[u]+cost[u][v];}
}
if(C[d]==inf)return 0;
return 1;
}
void update()
{
for(u=d;u;u=T[u])
{ flow[T[u]][u]++;flow[u][T[u]]--;}
}
void prints()
{
for(u=1;u<=n;u++)
for(v=n+1;v<d;v++)
sol+=flow[u][v]*cost[u][v];
printf("%d",sol);
}