Cod sursa(job #446737)

Utilizator voyagerSachelarie Bogdan voyager Data 26 aprilie 2010 15:54:47
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <queue>
#include <algorithm>
#define NMAX 1000
#define INF 0x40000000

using namespace std;

vector<int> E[NMAX];
int C[NMAX][NMAX], F[NMAX][NMAX], n, m, p[NMAX];
bool viz[NMAX];
queue<int> Q;

bool bfs()
{
	int nod;
	memset(viz, 0, sizeof(viz));
	Q.push(1);
	for (; !Q.empty(); Q.pop())
	{
		nod = Q.front();
		viz[nod] = true;
		if (nod == n) continue;
		for (vector<int>::iterator it = E[nod].begin(); it != E[nod].end(); ++it)
			if (C[nod][*it] != F[nod][*it] && !viz[*it])
			{
				Q.push(*it);
				p[*it] = nod;
			}
	}
	while (!Q.empty()) Q.pop();
	return viz[n];
}

int main()
{
	int x, y, c, flow, nod, delta;
	FILE *fin = freopen("maxflow.in", "r", stdin), *fout = freopen("maxflow.out", "w", stdout);
	scanf("%d %d", &n, &m);
	for (; m; --m)
	{
		scanf("%d %d %d", &x, &y, &c);
		E[x].push_back(y);
		E[y].push_back(x);
		C[x][y] += c;
	}
	for (flow = 0; bfs();)
		for (vector<int>::iterator it = E[n].begin(); it != E[n].end(); ++it)
		{
			nod = *it;
			if (F[nod][n] == C[nod][n] || !viz[nod]) continue;
	        p[n] = nod;
			delta = INF;
			for (nod = n; nod - 1; nod = p[nod])
				delta = min(delta, C[p[nod]][nod] - F[p[nod]][nod]);
			for (nod = n; nod - 1; nod = p[nod])
			{
				F[p[nod]][nod] += delta;
				F[nod][p[nod]] -= delta;
			}
			flow += delta;
		}
	printf("%d\n", flow);
	return 0;
}