Cod sursa(job #76304)

Utilizator gigi_becaliGigi Becali gigi_becali Data 9 august 2007 12:43:32
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
using namespace std;
#include <cstdio>
#include <string>
#include <queue>
#include <deque>
#include <cstdlib>
#include <ctime>
#include <vector>
#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;
}
struct cmp{
	bool operator()(const int &a, const int &b)const
	{
		if(d[a]>d[b])return 1;
		return 0;
	}
};

int bellman2()
{
	
	int i,j;
	
	memset(d, oo, sizeof(d));
	memset(t, 0, sizeof(t));
	d[source]=0;
	int ok=1;
	int *pcap;
	
	priority_queue<int, vector<int>, cmp>Q;
	Q.push(source);
	int u, p, aux;
	while(!Q.empty())
	{
	//	p=rand()%Q.size();
		i=Q.top();//Q[p];
		//aux=Q[p];Q[p]=Q[0];Q[0]=aux;
		Q.pop();
		
		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;
						Q.push(j);
					}
	}		

		
	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(bellman2());//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()
{
	srand(time(0));
	read();
	//printf("%d\n", n);
	maxflow();
	return 0;
}