Cod sursa(job #57092)

Utilizator cezar305Mr. Noname cezar305 Data 1 mai 2007 09:59:48
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#include<stdio.h>
#define INF 1000000000
FILE *fi,*fo;


long n,n1,n2,m,i,j;
long x,y,expense;
long C[203][203],E[203][203],A[203][203];
long P[203],V[203];
long suma(long, long);
long min(long, long);
void Bellman();
void flux();

int main()
{
fi=fopen("cc.in","rt");
fscanf(fi,"%ld",&n);
// 0 este sursa
// n+1 este destinatia
// n1 este numarul de varfuri din V1
// n2 este numarul de varfuri din V2
// m este numarul de arce de la V1 la V2
n1=n;
n2=n;
m=n*n;
n=n1+n2;
for (i=0;i<=n+1;i++)
	for (j=0;j<=n+1;j++)
		{
		C[i][j]=0;
		E[i][j]=INF;
		}
for (i=1;i<=n1;i++)
	for (j=1;j<=n1;j++)
		{
		fscanf(fi,"%ld",&expense);
		C[i][j+n1]=1;
		E[i][j+n1]=expense;
		}
fclose(fi);
for (i=1;i<=n1;i++)
	{
	C[0][i]=1;
	E[0][i]=0;
	}
for (i=n1+1;i<=n;i++)
	{
	C[i][n+1]=1;
	E[i][n+1]=0;
	}
flux();
long sum=0;
for (i=1;i<=n;i++)
	for (j=1;j<=n;j++)
		if (C[j][i]>0 && E[i][j]<INF)
			sum+=E[i][j];
fo=fopen("cc.out","wt");
fprintf(fo,"%ld",sum);
fclose(fo);
return 0;
}

long suma(long a, long b)
{
if (a==INF || b==INF)
	return INF;
return a+b;
}

long min(long a, long b)
{
if (a<=b)
	return a;
return b;
}

void Bellman()
{
long i,j,t;
for (i=0;i<=n+1;i++)
	for (j=0;j<=n+1;j++)
		if (i==j)
			A[i][j]=0;
		else
			A[i][j]=INF;
for (i=0;i<=n+1;i++)
	for (j=0;j<=n+1;j++)
		if (E[i][j]<INF)
			{
			if (C[i][j]>0)
				A[i][j]=E[i][j];
			if (C[j][i]>0)
				A[j][i]=-E[i][j];
			}
for (i=0;i<=n+1;i++)
	{
	P[i]=-1;
	V[i]=INF;
	}
V[0]=0;
do
	{
	t=1;
	for (i=0;i<=n+1;i++)
		for (j=0;j<=n+1;j++)
			if (suma(V[i],A[i][j])<V[j] && C[i][j]>0)
				{
				t=0;
				V[j]=suma(V[i],A[i][j]);
				P[j]=i;
				}
	}
while (t==0);
}

void flux()
{
long i,eps;
while (1)
	{
	Bellman();
	if (P[n+1]==-1)
		return;
	eps=INF;
	for (i=n+1;i!=0;i=P[i])
		eps=min(eps,C[P[i]][i]);
	for (i=n+1;i!=0;i=P[i])
		{
		C[P[i]][i]-=eps;
		C[i][P[i]]+=eps;
		}
	}
}