Cod sursa(job #243452)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 12 ianuarie 2009 23:10:05
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#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);
}