Cod sursa(job #1826680)

Utilizator msciSergiu Marin msci Data 10 decembrie 2016 18:52:28
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 1005;

int N, M;
vector<int> adj[NMAX];
int capacity[NMAX][NMAX];

int maximumFlow(int source, int sink) {
	int residual[NMAX][NMAX]; memset(residual, 0, sizeof(residual));
	int totalFlow = 0;
	while (true) {
		int flow[NMAX]; memset(flow, 0, sizeof(flow));
		int prev[NMAX]; memset(prev, -1, sizeof(prev));
		prev[source] = source; flow[source] = INT_MAX;
		queue<int> q; q.push(source);
		while (!q.empty()) {
			int u = q.front(); q.pop();
			for (int i = 0; i < adj[u].size(); i++) {
				int v = adj[u][i];
				if (capacity[u][v] - residual[u][v] > 0 && prev[v] == -1) {
					prev[v] = u;
					flow[v] = min(flow[u], capacity[u][v] - residual[u][v]);
					if (v != sink) q.push(v);
					else {
						while (prev[v] != v) {
							u = prev[v];
							residual[u][v] += flow[sink];
							residual[v][u] -= flow[sink];
							v = u;
						}
						totalFlow += flow[sink];
						goto end;
					}
				}
			}
		}
end:
		if (prev[sink] == -1) {
			return totalFlow;
		}
	}
	return -1;
}

int main() {
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);
	scanf("%d %d", &N, &M);
	for (int i = 0; i < M; i++) {
		int x, y, w;
		scanf("%d %d %d", &x, &y, &w);
		adj[x].push_back(y);
		capacity[x][y] = w;
	}
	int ret = maximumFlow(1, N);
	printf("%d\n", ret);
}