Cod sursa(job #305827)

Utilizator FlorianFlorian Marcu Florian Data 18 aprilie 2009 17:40:58
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
#define Max 102
#define Inf 0x3f3f3f3f
int cst[2*Max][2*Max];
int N;
int S,D;
int capac[2*Max][2*Max];
vector<int>G[2*Max+5];
int dist[2*Max];
int tata[2*Max];
int Sum;
void read()
{
	freopen("cc.in","r",stdin);
	freopen("cc.out","w",stdout);
	scanf("%d",&N);
	int i,j;
	for(i=1;i<=N;++i)
		for(j=1;j<=N;++j)
		{
			scanf("%d",&cst[i][N+j]);
			cst[N+j][i] = -cst[i][N+j];
			G[i].push_back(N+j);
			G[N+j].push_back(i);	
			capac[i][N+j] = 1;
		}
	S=0; D = 2*N + 1;
	for(i=1;i<=N;++i)
	{
		G[S].push_back(i);
		G[i].push_back(S);
		cst[S][i] = cst[i][S] = 0;
		capac[S][i] = 1;
		G[N+i].push_back(D);
		G[D].push_back(N+i);
		capac[N+i][D] = 1;
		cst[N+i][D] = cst[D][N+i] = 0;
	}
}
void flux()
{
	int x,y,i;
	int viz[2*Max];
	N = 2*N+1;
	queue<int> Q;
	for(;;)
	{
		for(i=1;i<=N;++i) {dist[i] = Inf; viz[i] = 0;}
		Q.push(S);
		dist[S] = 0;
		for(;!Q.empty();Q.pop())
		{
			x = Q.front();
			viz[x] = 0;
			for(i=0;i<G[x].size();++i)
			{
				y=G[x][i];
				if(capac[x][y] && dist[y] > dist[x] + cst[x][y])
				{
					dist[y] = dist[x] + cst[x][y];
					tata[y] = x;
					if(!viz[y])
					{
						viz[y] = 1;
						Q.push(y);
					}
				}
			}
		}
		if(dist[D] == Inf) return;
		int flmin = Inf;
		for(i=D;i!=S;i=tata[i])
			if(flmin > capac[tata[i]][i]) flmin = capac[tata[i]][i];
		for(i=D;i!=S;i=tata[i])
		{
			capac[tata[i]][i] -= flmin;
			capac[i][tata[i]] += flmin;
		}
		Sum += dist[D] * flmin;
	}
}
int main()
{
	read();
	flux();
	printf("%d\n",Sum);
	return 0;
}