Cod sursa(job #1350932)

Utilizator ELHoriaHoria Cretescu ELHoria Data 21 februarie 2015 00:23:08
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <cstdio>
#include <vector>
#include <cstring>


using namespace std;

const int nmax = int(1e3) + 2, inf = int(2e9);
int N, M;
int F[nmax][nmax];
int cap[nmax][nmax];
int T[nmax];
vector<int> G[nmax];
bool visited[nmax];
int Q[nmax];

void readData() {
	scanf("%d %d", &N, &M);
	int a, b, c;
	for (int i = 0; i < M; i++) {
		scanf("%d %d %d", &a, &b, &c);
		cap[a][b] += c;
		G[a].push_back(b);
		G[b].push_back(a);
	}
}

inline bool bfs(const int &source, const int &sink) {
	int L, R;
	L = R = 0;
	memset(visited, 0, sizeof(visited));
	T[source] = source;
	visited[source] = true;
	Q[R++] = source;
	while (L < R) {
		int v = Q[L++];
		if (v == sink) continue;
		for (const int &w : G[v]) {
			if (!visited[w] && F[v][w] < cap[v][w]) {
				visited[w] = true;
				T[w] = v;
				Q[R++] = w;
			}
		}
	}
	return visited[sink];
}

int getFlow(const int &source, const int &sink) {
	int ret = 0;
	while (bfs(source, sink)) {
		for (const int &v : G[sink]) {
			if (!visited[v] || cap[v][sink] == F[v][sink]) continue;
			T[sink] = v;
			int fmax = inf;
			for (int w = sink; w != source; w = T[w]) {
				fmax = min(fmax, cap[T[w]][w] - F[T[w]][w]);
			}

			if (!fmax) continue;
			ret += fmax;
			for (int w = sink; w != source; w = T[w]) {
				F[T[w]][w] += fmax;
				F[w][T[w]] -= fmax;
			}
		}
	}
	return ret;
}

int main()
{
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);
	readData();
	printf("%d\n", getFlow(1, N));
	return 0;
}