Cod sursa(job #1536964)

Utilizator deividFlorentin Dumitru deivid Data 26 noiembrie 2015 20:04:13
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <stdio.h>
#include <vector>
#include <queue>

#define maxdim 1005

using namespace std;

int n, m;
int cap[maxdim][maxdim], f[maxdim][maxdim], viz[maxdim], T[maxdim];
vector<int> G[maxdim];

bool bfs() {
	queue<int> q;
	for (int i = 1; i <= n; ++i) {
		viz[i] = 0;
	}
	
	int r = 0;
	q.push(1);
	viz[1] = 1;
	while (!q.empty()) {
		int nod = q.front(); q.pop();
		for (int vecin : G[nod]) {
			if (cap[nod][vecin] > f[nod][vecin] && !viz[vecin]) {
				if (vecin == n) {
					r = 1;
					continue;
				}
				q.push(vecin);
				viz[vecin] = 1;
				T[vecin] = nod;
			}
		}
	}
	
	return r;
}

int main() {
	
	#ifndef ONLINE_JUDGE
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);
	#endif // ONLINE_JUDGE
	
	scanf("%d %d", &n, &m);
	for (int i = 1; i <= m; ++i) {
		int x, y, c; scanf("%d %d %d", &x, &y, &c);
		G[x].push_back(y);
		G[y].push_back(x);
		cap[x][y] += c;
	}
	
	int sol = 0;
	while (bfs()) {
		
		for (int prev : G[n]) {
			T[n] = prev;
			int nod = n;
			int maxf = 1<<29;
			while (nod != 1 && maxf > 0) {
				maxf = min(maxf, cap[T[nod]][nod] - f[T[nod]][nod]);
				nod = T[nod];
			}
			
			if (maxf > 0) {
				nod = n;
				while (nod != 1) {
					f[T[nod]][nod] += maxf;
					f[nod][T[nod]] -= maxf;
					nod = T[nod];
				}
				sol += maxf;
			}
		}
	}
	
	printf("%d\n", sol);

	return 0;
}