Cod sursa(job #133473)

Utilizator raula_sanChis Raoul raula_san Data 8 februarie 2008 18:44:17
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <cstdio>
#include <vector>
#include <queue>

#define dim 202

#define pb push_back
#define mp make_pair

using namespace std;

int N, S;
int T[dim], D[dim], F[dim][dim], C[dim][dim];

vector < pair <int, int> > G[dim];

queue <int> Q;

int Bellman()
{
	Q.push(0);
	
	for(int i=1; i<=N; ++i)
	{
		T[i] = 0;
		D[i] = 0x3f3f3f3f;
	}
	T[0] = D[0] = 0;
	
	while(Q.empty() == false)
	{
		int nd = Q.front();
		Q.pop();
		
		for(vector < pair < int, int > > :: iterator it=G[nd].begin(); it!=G[nd].end(); ++it)
		{
			int nnd = it -> first;
			int c = it -> second;
			
			if(F[nd][nnd] < C[nd][nnd] && D[nnd] > D[nd] + c)
			{
				D[nnd] = D[nd] + c;
				T[nnd] = nd;
				Q.push(nnd);
			}
		}
	}
	
	return T[N] != 0;
}

void Read()
{
	freopen("cc.in", "rt", stdin);
	
	int i, j, c;
	
	for(scanf("%d", &N), i=1; i<=N; ++i)
	{
		G[0].pb(mp(i, 0));
		G[i].pb(mp(0, 0));
	
		C[0][i] = 1;
		
		G[N+i].pb(mp(2*N+1, 0));
		G[2*N+1].pb(mp(N+i, 0));
	
		C[N+i][2*N+1] = 1;
	
		for(j=1; j<=N; ++j)
		{
			scanf("%d", &c);
			
			C[i][N+j] = 1;
			
			G[i].pb(mp(N+j, c));
			G[N+j].pb(mp(i, -c));
		}
	}
	
	fclose(stdin);
}

void Flow()
{
	N = 2 * N + 1;
	
	while(Bellman())
	{
		int i, r = 0x3f3f3f3f;
		
		for(i=N; i; i=T[i])
			if(C[T[i]][i] - F[T[i]][i] < r)
				r = C[T[i]][i] - F[T[i]][i];
				
		if(!r) continue;
		
		for(i=N; i; i=T[i])
		{
			F[T[i]][i] += r;
			F[i][T[i]] -= r;
		}
		
		S += D[N];
	}
}

void Write()
{
	freopen("cc.out", "wt", stdout);
	
	printf("%d", S);
	
	fclose(stdout);
}

int main()
{
	Read();
	Flow();
	Write();
	
	return 0;
}