Cod sursa(job #973577)

Utilizator tudorv96Tudor Varan tudorv96 Data 14 iulie 2013 19:26:48
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <fstream>
#include <queue>
using namespace std;

typedef pair <int, int> data;

#define oo 0x3f3f3f3f
#define min(a,b) ((a < b) ? a : b)

ifstream fin ("cc.in");
ofstream fout ("cc.out");

vector <vector <int> > cost, c;
vector <int> dist, t;
queue <int> Q;
vector <bool> q;
int n, s, d, sol;

bool bellmanford() {
	dist.assign (2*(n+1), oo);
	q.assign (2*(n+1), 0);
	dist[s] = 0;
	Q.push(s);
	q[s] = 1;
	while (Q.size()) {
		int x = Q.front();
		Q.pop();
		for (int i = 1; i <= d; ++i)
			if (c[x][i] && dist[x] + cost[x][i] < dist[i]) {
				dist[i] = dist[x] + cost[x][i];
				t[i] = x;
				Q.push(i);
			}
	}
	return (dist[d] != oo);
}

void Resizeall(int x) {
	c.resize(x);
	cost.resize(x);
	dist.resize(x);
	t.resize(x);
	q.resize(x);
	for (int i = 0; i < x; ++i)
		c[i].resize(x), cost[i].resize(x);
}

int main() {
	fin >> n;
	Resizeall(2*(n+1));
	s = 0;
	d = 2 * n + 1;
	for (int i = 1; i <= n; ++i)
		for (int j = 1; j <= n; ++j) {
			int x;
			fin >> x;
			c[i][n+j] = 1;
			cost[i][n+j] = x;
			cost[n+j][i] = -x;
		}
	for (int i = 1; i <= n; ++i)
		c[s][i] = c[n+i][d] = 1;
	while (bellmanford()) {
		for (int x = d; x != s; x = t[x])
			--c[t[x]][x], c[x][t[x]]++;
		sol += dist[d];
	}
	fout << sol;
	fout.close();
}