Cod sursa(job #1423689)

Utilizator phobosJustin Lim Kai Ze phobos Data 22 aprilie 2015 12:19:59
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
const int MX = 1001, INF = 1e9;
int n, m, x, y, c;
vector<vector<int> > adj(MX);
int cap[MX][MX], ans = 0, from[MX];

bool find() {
	memset(from, -1, sizeof from);
	queue<int> q;
	q.push(1);
	int v[MX];
	for (int i = 0; i < MX; i++) {
		v[i] = 0;
	}
	v[1] = 1;
	while (!q.empty()) {
		int u = q.front();
		q.pop();
		for (int i = 0; i < adj[u].size(); i++) {
			int d = adj[u][i];
			if (!v[d] && cap[u][d] > 0) {
				q.push(d);
				v[d] = 1;
				from[d] = u;
			}
		}
	}
	int d = n, mn = INF;
	while (from[d] != -1) {
		mn = min(cap[from[d]][d], mn);
		d = from[d];
	}
	d = n;
	while (from[d] != -1) {
		cap[from[d]][d] -= mn;
		cap[d][from[d]] += mn;
		d = from[d];
	}
	if (mn == INF) return 0;
	else {
		ans += mn;
		return 1;
	}
}

int main() {
	freopen ("maxflow.in", "r", stdin);
	freopen ("maxflow.out", "w", stdout);
	scanf("%d%d", &n, &m);
	memset(cap, 0, sizeof cap);
	for (int i = 0; i < m; i++) {
		scanf("%d%d%d", &x, &y, &c);
		adj[x].push_back(y);
		adj[y].push_back(x);
		cap[x][y] = c;
	}
	while (find());
	printf("%d", ans);
	return 0;
}