Cod sursa(job #302)

Utilizator blasterzMircea Dima blasterz Data 9 decembrie 2006 14:13:25
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <string>
#include <cstdio>
#define maxn 128
#define oo 0x3f3f3f3f
int cap[maxn<<1][maxn<<1], cost[maxn<<1][maxn<<1];
int n, m, i, j, k, t, sursa, dest, v, d[maxn], tata[maxn], actual;
bool viz[maxn<<1];
void citire()
{
	freopen("cc.in", "r", stdin);
	scanf("%d\n", &n);
	int i, j, p;
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
		{
			scanf("%d ", &p);
			cap[i][j+n]=1;
			cost[i][j+n]=p;
			cost[j+n][i]=-p;
		}
	sursa=0;
	dest=2*n + 1;
	for(i=1;i<=n;i++) cost[sursa][i]=cost[i][sursa]=0, cap[sursa][i]=1;
	
	for(i=n+1;i<=n<<1;i++) cost[dest][i]=cost[i][dest]=0, cap[i][dest]=1;
}

void bellman()
{

	int i, actual;
	int d[256];
	memset(d, oo, sizeof(d));
	memset(tata, 0, sizeof(tata));
	
	d[0]=0;
	actual=1;
	
	while(actual)
	{
		actual=0;
		for(i=sursa;i<=dest;i++)
			if(d[i]!=oo)
			for(j=sursa;j<=dest;j++)
				if(cap[i][j])
					if(d[i]+cost[i][j]<d[j])
					{
						d[j]=d[i]+cost[i][j];
						tata[j]=i;
						actual=1;
					}
	}
}

void dijkstra()
{

	int i, min, nod;
	int d[maxn<<1];
	bool viz[maxn<<1];
	memset(viz, 0, sizeof(viz));
	memset(d, oo, sizeof(d));
	memset(tata, 0, sizeof(tata));
	
	d[0]=0;
	
	while(1)
	{
	
		min=oo;
		nod=-1;
		for(i=sursa;i<=dest;i++)
			if(!viz[i] && min>d[i]) min=d[i], nod=i;
			
		if(min==oo) return;
		viz[nod]=1;
		
		for(i=sursa;i<=dest;i++)
			if(cap[nod][i])
				if(d[i]>d[nod]+cost[nod][i])
				{
					d[i]=d[nod]+cost[nod][i];
					tata[i]=nod;
				}
	}
}
			
		
		
			
		
	


void umple_sigur()
{
	int i;
	i=dest;
	
	while(i)
	{
		j=tata[i];
		cap[j][i]=0;
		cap[i][j]=1;
		i=j;
	}
}

void umple()
{
	bellman();
	//dijkstra();
	umple_sigur();
}

int gata()
{
	int v=0, i;
	for(i=n+1;i<=n<<1;i++) if(cap[i][dest]==0) v++;
	
	return v==n;
}

void scrie()
{
	t=0;
	for(i=1;i<=n;i++) 
	{
		k=0;
		
		for(j=n+1;j<=n<<1;j++)
			if(cap[i][j]==0 && cost[i][j]!=oo) k=j;
	
		t+=cost[i][k];
	
	
	}
	
	freopen("cc.out", "w", stdout);
	
	printf("%d\n", t);
	/*
	for(i=1;i<=n;i++)
	{
		k=0;
		for(j=n+1;j<=n<<1;j++)
			if(cap[i][j]==0 && cost[i][j]!=oo) k=j;
		printf("%d ", k-n);
	}
	*/
}


int main()
{
	citire();
	do umple(); while(!gata());
	scrie();
	return 0;
}