Cod sursa(job #234651)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 21 decembrie 2008 15:23:38
Problema Cc Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#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;
	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])
		   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]]--;
	}
}