Cod sursa(job #2423797)

Utilizator lilian_ciobanuLilian Ciobanu lilian_ciobanu Data 21 mai 2019 22:38:10
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <bits/stdc++.h>
using namespace std;

const int N = 1005;
const int INF = 0x3f3f3f3f;

struct edge {
	int to, flow;
};

int i, n, m, x, y, z, q[N], dist[N], ptr[N], st, dr;
vector<edge> E;
vector<int> lda[N];

void addEdge(int x, int y, int flow) {
	E.push_back({y, flow});
	E.push_back({x, 0});
	lda[x].push_back(E.size() - 2);
	lda[y].push_back(E.size() - 1);
}

bool bfs() {
	memset(dist, INF, sizeof(dist));
	dist[1] = 0;
	for (st = dr = 0, q[st] = 1; st <= dr && dist[n] == INF; ++st) {
		int x = q[st];
		for (int it : lda[x]) {
			if (dist[E[it].to] != INF || E[it].flow <= 0) continue;
			dist[E[it].to] = dist[x] + 1;
			q[++dr] = E[it].to;
		}
	}
	return dist[n] != INF;
}

int dfs(int x, int flow) {
	if (x == n || flow <= 0) return flow;
	for (; ptr[x] < lda[x].size(); ++ptr[x]) {
		int it = lda[x][ptr[x]];
		if (dist[E[it].to] != dist[x] + 1) continue;
		int pushed = dfs(E[it].to, min(flow, E[it].flow));
		if (pushed > 0) {
			E[it].flow -= pushed;
			E[it ^ 1].flow += pushed;
			return pushed;
		}
	}
	return 0;
}

int maxFlow() {
	int flow = 0;
	while (bfs()) {
		//cerr << "123\n";
		memset(ptr, 0, sizeof(ptr));
		while(1) {
			int pushed = dfs(1, INF);
			if (!pushed) break;
			flow += pushed, exit(0);
		}
	}
	return flow;
}

int main() {
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);
	for(scanf("%d %d", &n, &m); m; --m) {
		scanf("%d %d %d", &x, &y, &z);
		addEdge(x, y, z);
	}
	printf("%d\n", maxFlow());
	return 0;
}