Cod sursa(job #303947)

Utilizator scvalexAlexandru Scvortov scvalex Data 10 aprilie 2009 15:53:51
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <queue>

using namespace std;

#define pb push_back
#define tr(C, i) for (typeof((C).begin()) i = (C).begin(); i != (C).end(); ++i)

typedef vector<int> VI;
typedef vector<VI> VVI;

const int oo = 1<<30;

int N, NN;
VVI G, C, W, F;
VI P, D;

bool bf(int S, int T) {
	fill(P.begin(), P.end(), 0);
	fill(D.begin(), D.end(), oo);

	queue<int> Q;
	Q.push(S);
	P[S] = S;
	D[S] = 0;

	while (!Q.empty()) {
		int u = Q.front();
		Q.pop();

		tr(G[u], vv) {
			int v = *vv;
			if ((C[u][v] - F[u][v] > 0) && (D[u] + W[u][v] < D[v])) {
				P[v] = u;
				D[v] = D[u] + W[u][v];
				Q.push(v);
			}
		}
	}

	return (P[T] != 0);
}

int main(int argc, char *argv[]) {
	int S, T;

	ifstream fin("cc.in");
	fin >> N;
	S = 0;
	NN = 2*N + 2;
	T = NN-1;
	G.resize(NN);
	C.resize(NN);
	fill(C.begin(), C.end(), VI(NN, 0));
	W.resize(NN);
	fill(W.begin(), W.end(), VI(NN, 0));
	for (int v = 1; v <= N; ++v) {
		G[S].pb(v);
		C[S][v] = 1;
		W[S][v] = 0;
		int vv = v+N;
		G[vv].pb(T);
		C[vv][T] = 1;
		W[vv][T] = 0;
	}
	for (int u = 1; u <= N; ++u)
		for (int v = N+1; v <= 2*N; ++v) {
			fin >> W[u][v];
			W[v][u] = -W[u][v];
			G[u].pb(v);
			C[u][v] = 1;
			G[v].pb(u);
		}
	fin.close();

	F.resize(NN);
	fill(F.begin(), F.end(), VI(NN, 0));
	P.resize(NN);
	D.resize(NN);
	int ct = 0;
	while (bf(S, T)) {
		int fmin = oo;

		for (int n = T; P[n] != n; n = P[n])
			fmin = min(fmin, C[P[n]][n] - F[P[n]][n]);
		
		for (int n = T; P[n] != n; n = P[n]) {
			F[P[n]][n] += fmin;
			F[n][P[n]] -= fmin;
		}

		ct += fmin * D[T];
	}

	ofstream fout("cc.out");
	fout << ct << endl;
	fout.close();

	return 0;
}