Cod sursa(job #763396)

Utilizator savimSerban Andrei Stan savim Data 2 iulie 2012 10:16:41
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <stdio.h>
#include <string.h>
#include <vector>
#include <algorithm>

using namespace std;

#define MAX_N 1010

int n, m, improve = 1, ans;

int tata[MAX_N], Q[MAX_N], use[MAX_N], flux[MAX_N];

int C[MAX_N][MAX_N], F[MAX_N][MAX_N];

vector <int> G[MAX_N];

void bfs() {
	int st = 0, dr = 1;
	Q[1] = 1; use[1] = 1; flux[1] = 1000000000;
	
	while (st < dr) {
		st++;
		
		int nod = Q[st];
		
		for (vector <int>::iterator it = G[nod].begin(); it != G[nod].end(); ++it)
			if (use[*it] == 0 && C[nod][*it] - F[nod][*it] > 0) {
				flux[*it] = min(flux[nod], C[nod][*it] - F[nod][*it]);
				tata[*it] = nod;
				use[*it] = 1;
				Q[++dr] = *it;
			}
		
		if (use[n]) //optimizare!!
			break;
	}

	improve = flux[n];
	
	if (improve) {
		for (int i = n; i != 1; i = tata[i]) {
			F[tata[i]][i] += flux[n];
			F[i][tata[i]] -= flux[n];
		}
	}
}

int main() {

	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);
	
	scanf("%d %d", &n, &m);
	for (int i = 1; i <= m; i++) {
		int a, b, c;
		scanf("%d %d %d", &a, &b, &c);
		G[a].push_back(b);
		C[a][b] += c;
	}
		
	while (improve) {
		memset(tata, 0, sizeof(tata));
		memset(use, 0, sizeof(use));
		memset(flux, 0, sizeof(flux));
		
		improve = 0;
		bfs();
		
		ans += improve;
	}
	
	printf("%d\n", ans);
	
	return 0;
}