Cod sursa(job #76280)

Utilizator gigi_becaliGigi Becali gigi_becali Data 9 august 2007 10:34:51
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <cstdio>
#include <string>
#define oo 0x3f3f3f3f
#define maxn 256

int cap[maxn][maxn], cost[maxn][maxn], val[maxn];
int n, source, sink;
int d[maxn],t[maxn];

void read()
{
	freopen("cc.in","r",stdin);
	scanf("%d\n", &n);
	int i, j, w;
	for(i=1;i<=n;++i)
		for(j=1;j<=n;++j)
		{
			scanf("%d ", &w);
			cost[i][j+n]=w;
			cost[j+n][i]=-w;
			cap[i][j+n]=1;
		}
	
		source=0, sink=n+n+1;
	for(i=1;i<=n;++i) cost[source][i]=0, cost[i][source]=0, cap[source][i]=1;
	for(i=n+1;i<sink;++i) cost[i][sink]=0, cost[sink][i]=0, cap[i][sink]=1;
}

int dijkstra()
{
	int d[maxn],t[maxn], i, min, u;
	bool viz[maxn];
	
	memset(viz, 0,sizeof(viz));
	memset(d, oo, sizeof(d));
	memset(t, 0, sizeof(t));
	d[source]=0;
	
	while(1)
	{
		min=oo;u=-1;
		for(i=source;i<=sink;++i)
			if(!viz[i] && min>d[i]) min=d[i], u=i;
		if(u==-1) break;
			//printf("%d\n", u);
		viz[u]=1;
		for(i=source;i<=sink;++i)
		{	if(cap[u][i])
			{
				
				min=d[u]+cost[u][i]+val[u]-val[i];
				//printf("%d %d %d %d %d\n", min, d[i], d[u], val[u], val[i]);
				if(min<d[i])
				{
					d[i]=min;
					t[i]=u;
				}
			}
			/*
			if(cap[i][u])
			{
				min=d[i]-cost[u][i]+val[i]-val[u];
				if(min<d[u])
				{
					d[u]=min;
					t[u]=i;
				}
			}
		*/
			}
	}
	for(i==source;i<=sink;++i) val[i]+=d[i];
	//for(i=source;i<=sink;++i) printf("%d ", d[i]);
	//printf("\n");
	if(d[sink]==oo) return 0;
	
	for(i=sink;i!=source;i=t[i])
		cap[t[i]][i]-=1,
		cap[i][t[i]]+=1;
	
	return 1;
}

int bellman()
{
	int i,j;
	
	memset(d, oo, sizeof(d));
	memset(t, 0, sizeof(t));
	d[source]=0;
	int ok=1;
	
	while(ok)
	{
		ok=0;
		
		for(i=source;i<=sink;++i)
			for(j=source;j<=sink;++j)
				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(d[sink]==oo) return 0;
	
	for(i=sink;i!=source;i=t[i])
		cap[t[i]][i]-=1,
		cap[i][t[i]]+=1;
	
	return 1;
}

void maxflow()
{
	int i, j;
	while(bellman());//printf("da\n");
	
	int sol=0;
	for(i=1;i<=n;++i)
		for(j=n+1;j<sink;++j)
			if(!cap[i][j])sol+=cost[i][j];
		
freopen("cc.out","w",stdout);
		printf("%d\n", sol);
	
	
}

int main()
{
	read();
	//printf("%d\n", n);
	maxflow();
	return 0;
}