Cod sursa(job #577402)

Utilizator dornescuvladVlad Eugen Dornescu dornescuvlad Data 10 aprilie 2011 11:18:06
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#define inf 0x3f3f3f3f

using namespace std;

const char iname[] = "cc.in";
const char oname[] = "cc.out";
const int  nmax	   = 380;

ifstream fin(iname);
ofstream fout(oname);

int n, m, s, dest, i, x, y, c, z, j;
vector<pair <int, int> > Gr[nmax];
int F[nmax][nmax], C[nmax][nmax], T[nmax],  rezid, cost, d[nmax];

int bellman_ford()
{	
	int i;
	int viz[nmax], t[nmax];
	for(i = 1; i <= 2 * n + 1; i ++)
	{
		T[i] = 0;
		viz[i] = 0;
		d[i] = inf;
		
	}
	queue<int> Q;
	viz[s] = 1;
	d[s] = 0;
	Q.push(s);
	while(!Q.empty())
	{
		x = Q.front();
		Q.pop();
		viz[x] = 0;
		for(vector<pair <int, int> >::iterator it = Gr[x].begin(); it != Gr[x].end(); ++it)
		{		
				if(F[x][it->first] < C[x][it->first] && d[x] + it->second < d[it->first])
				{
					d[it->first] = d[x] + it->second;
					if(viz[it->first] == 0)
					{
						viz[it->first] = 1;
						Q.push(it->first);
					}
					T[it->first] = x;
				}
		}
	}
	if(d[dest] != inf)
		return 1;
	return 0;
}


int main()
{
	fin >> n;
	for(i = 1; i <= n; i ++)
		for(j = 1; j <= n; j ++)
		{	
			fin >> x;
			Gr[i].push_back(make_pair(n + j , x));
			Gr[n + j].push_back(make_pair(i, -x));
			C[i][n + j] = 1;
		}
	
	dest = 2 * n + 1;
	s = 0;
	for(i = 1; i <= n; i ++)
	{
		Gr[0].push_back(make_pair(i, 0));
		C[0][i] = 1;
		Gr[i].push_back(make_pair(0, 0));
		Gr[n + i].push_back(make_pair(2 * n + 1, 0));
		Gr[2 * n + 1].push_back(make_pair(n + i, 0));
		C[n + i][2 * n + 1] = 1;
	}
	for(i = 0; i <= 2 * n + 1; i ++)
		d[i] = inf;
	while(bellman_ford())
	{	
		rezid = inf;
		rezid = C[T[dest]][dest] - F[T[dest]][dest];
		for(i = dest; T[i] ; i = T[i])
			rezid = min(rezid, C[T[i]][i] - F[T[i]][i]);
		for(i = dest; i != 0 ; i = T[i])
		{
			F[T[i]][i] += rezid;
			F[i][T[i]] -= rezid;
		}
		cost += rezid * d[dest];
		for(i = 1; i <= 2 * n + 1; i ++)
			d[i] = inf;
	}
	fout << cost << "\n";
	
	return 0;
}