Cod sursa(job #674911)

Utilizator darkseekerBoaca Cosmin darkseeker Data 6 februarie 2012 21:18:53
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <fstream>
#include <queue>
#include <vector>
using namespace std;

#define NMAX 220
#define in "cc.in"
#define out "cc.out"
#define inf 1000000

queue<int> Q;
int inQ[NMAX],dist[NMAX],t[NMAX];
int F[NMAX][NMAX],C[NMAX][NMAX],Cost[NMAX][NMAX],N,G[NMAX][NMAX];
	ofstream fout(out);
int bf()
{
	int i,nod,v;
	int li = N + 2;
	int ls = 2 * N + 1;
	int d = 2 * N + 2;
	
	for(i = 1; i <= d; i++)
	{
		dist[i] = inf;
		inQ[i] = 0;
	}
	
	dist[1] = 0;
	Q.push(1);
	
	while(!Q.empty())
	{
		nod = Q.front();
		Q.pop();
		inQ[nod] = 0;
		for(v = 1; v <= G[nod][0]; v++)
		{
			i = G[nod][v];
			if(dist[nod] + Cost[nod][i] < dist[i] && C[nod][i] > F[nod][i])
			{
				dist[i] = dist[nod] + Cost[nod][i];
				t[i] = nod;
				if(!inQ[i])
				{
					inQ[i] = 1;
					Q.push(i);
				}
			}
		}
	}
	
	int flux = inf;
	
	if(dist[d] != inf)
	{
		for(i = d; i != 1; i = t[i])
			flux = min(C[t[i]][i] - F[t[i]][i],flux);
		
		for(i = d; i != 1; i = t[i])
			{
				F[t[i]][i] += flux;
				F[i][t[i]] -= flux;
		}
		return flux * dist[d];
	}
	return 0;
}

int Flux()
{
	int ans = 0,tans;
	do
	{
		tans = bf();
		ans += tans;
	}while(tans);
	
	int i,j;
	
	return ans;
}

int main()
{
	ifstream fin(in);

	int i,j,c;
	
	fin>>N;
	
	for(i = 2; i <= N + 1; i++)
		for(j = 1; j <= N; j++)
			{
				fin>>Cost[i][j + N + 1];
				C[i][j + N + 1] = 1;
				C[j + N + 1][i] = 0;
				Cost[j + N + 1][i] = -Cost[i][j + N + 1];
				G[i][++G[i][0]] = j + N + 1;
				G[j + N + 1][++G[j + N + 1][0]] = i;
			}
		
	for(i = 2; i <= N + 1; i++)
		{
			C[1][i] = 1;
			G[i][++G[i][0]] = 1;
			G[1][++G[1][0]] = i;
		}
	
	for(i = N + 2; i <= 2 * N + 1; i++)
	{
		C[i][2 * N + 2] = 1;
		G[i][++G[i][0]] = 2 * N + 2;
	}
	
	fout<<Flux()<<'\n';
	
	fin.close();
	fout.close();
	
	return 0;
}