Cod sursa(job #19100)

Utilizator gigi_becaliGigi Becali gigi_becali Data 18 februarie 2007 19:16:09
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <stdio.h>
#include <string.h> 
#define maxn 128
#define For(i, a, b) for(int i=(a);i<=(b);++i)

int cap[2*maxn][2*maxn],cost[2*maxn][2*maxn], n, source, sink;
	int t[2*maxn], d[2*maxn];
void citire()
{
	freopen("cc.in", "r", stdin);
	scanf("%d\n", &n);
	int i, j;
	For(i, 1,n)
	For(j, 1, n)
	{
		int p;
		scanf("%d", &p);
		cost[i][j+n]=p;
		cost[j+n][i]=-p;
		cap[i][j+n]=1;
	}

	source=0;
	sink=2*n+1;
	For(i, 1, n) cap[source][i]=1;
	For(i, n+1, sink-1) cap[i][sink]=1;
}

int bellman()
{
	int i, j,k, ok=1;

	memset(t, -1, sizeof(t));
	memset(d, 0x3f3f3f3f, sizeof(d));
	d[source]=0;

	for(ok=k=1;k<=sink && ok;k++)
       //	while(ok)
	{
		ok=0;

		For(i, source, sink)
			For(j, source, sink)
				if(cap[i][j])
				  if(d[i]+cost[i][j]<d[j])
				  {
				      d[j]=d[i]+cost[i][j];
				      t[j]=i;
				      ok=1;
				  }
	}

	if(t[sink]==-1) return 0;

	i=sink;

	while(i!=source) cap[t[i]][i]=0, cap[i][t[i]]=1, i=t[i];
       //	printf("da\n");

	return 1;
}

int flux()
{
	int flow=0;
	while(bellman());


	int i, j;

	For(i,1,n)
	{
		For(j, n+1, sink-1)if(cap[i][j]==0) flow+=cost[i][j];
	}
       //	for(i=1;i<=n;i++)
	//for(j=n+1;j<=sink-1;j++) if(cap[i][j]==0) flow+=cost[i][j];


return flow;
}



int main()
{

	citire();

	  freopen("cc.out", "w", stdout);
	printf("%d\n", flux());

	int i, j;
   return 0;
}