Cod sursa(job #639252)

Utilizator JBaccountCatalin JBaccount Data 22 noiembrie 2011 21:13:02
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.16 kb
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <queue>

using namespace std;

#define NM 205
#define PB push_back
#define inf 1000000000

int N, s, d, D[NM][NM], C[NM][NM], F[NM][NM], flow;

vector <int> G[NM];

int blf()
{
	int inside[NM], dist[NM], fat[NM];
	queue <int> Q;
	memset (inside, 0, sizeof(inside));
	for (int i = s; i <= d; ++i) dist[i] = inf;
	Q.push(s);
	inside[s] = 1;
	dist[s] = 0;
	fat[s] = -1;
	
	while (!Q.empty())
	{
		int node = Q.front();
		Q.pop();
		inside[node] = 0;
		
		for (vector<int>::iterator it = G[node].begin(); it != G[node].end(); ++it)
		{
			int nnode = *it;
			if (C[node][nnode] == F[node][nnode]) continue;
			if (dist[node] + D[node][nnode] < dist[nnode])
			{
				dist[nnode] = dist[node] + D[node][nnode];
				fat[nnode] = node;
				if (!inside[nnode])
				{
					Q.push(nnode);
					inside[nnode] = 1;
				}	
			}	
		}	
	}	
	
	/*
	for (int i = 0; i <= d; ++i) printf ("%d ", dist[i]);
	printf ("\n");
	*/
	
	if (dist[d] == inf) return 0;
	int node = d, flowadd = inf;
	while (fat[node] != -1)
	{
		int nnode = fat[node];
		flowadd = min(flowadd, C[nnode][node] - F[nnode][node]);
		node = nnode;
	}	
	flow += dist[d]*flowadd;
	node = d;
	while (fat[node] != -1)
	{
		int nnode = fat[node];
		F[nnode][node] += flowadd;
		F[node][nnode] -= flowadd;
		node = nnode;
	}
	return 1;
}

int main()
{
	freopen ("cc.in", "r", stdin);
	freopen ("cc.out", "w", stdout);
	
	scanf ("%d", &N);
	
	for (int i = 1; i <= N; ++i)
		for (int j = 1; j <= N; ++j)
		{
			int dst;
			scanf ("%d", &dst);
			D[i][N+j] = dst;
			D[N+j][i] = -dst;
			G[i].PB(N+j);
			G[N+j].PB(i);
			C[i][N+j] = 1;
		}	
	
	s = 0, d = 2*N + 1;	
	
	for (int i = 1; i <= N; ++i)
	{
		C[s][i] = 1;
		G[s].PB(i);
		G[i].PB(s);
	}	
	
	for (int i = 1; i <= N; ++i)
	{
		C[N+i][d] = 1;
		G[N+i].PB(d);
		G[d].PB(N+i);
	}	
	
	/*
	for (int i = s; i <= d; ++i)
	{
		printf ("%d: -> ", i);
		for (int j = 0; j < G[i].size(); ++j) printf ("%d ", G[i][j]);
		printf ("\n");
	}	
	*/
	
	while (blf());
	
	printf ("%d", flow);
	
	return 0;
}