Cod sursa(job #2658014)

Utilizator akumariaPatrascanu Andra-Maria akumaria Data 12 octombrie 2020 21:46:12
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <cstdio>
#include <vector>
#include <queue>

using namespace std;

int cap[1003][1003];
int fl[1003][1003];

vector<vector<int>> arcs;
vector<bool> viz;
vector<int> parents;

int n;

bool bfs() {
	queue<int> q;
	viz.assign(n+2, false);
	int current_node, next_node;

	q.push(1);
	viz[1] = 1;
	while (q.size()) {
		current_node = q.front();
		q.pop();

		for(int i=0; i<arcs[current_node].size(); ++i) {
			next_node = arcs[current_node][i];

			if (fl[current_node][next_node] != cap[current_node][next_node] && viz[next_node] == false) {
				q.push(next_node);
				viz[next_node] = true;
				parents[next_node] = current_node;

				if (next_node == n)
					return true;
			}
		}
	}

	return false;
}


int main() {
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);

	int m, a, b, c, flow = 0, flowmin = 0;
	scanf("%d%d", &n, &m);
	arcs.resize(n+2);
	parents.resize(n+2, 0);

	for(int i=0; i<m; ++i) {
		scanf("%d%d%d", &a, &b, &c);
		cap[a][b] +=c;
		arcs[a].push_back(b);
		arcs[b].push_back(a);
	}


	while (bfs()) {
		flowmin = -1;
		for(int i = n; i != 1; i = parents[i])
			if (flowmin == -1 || flowmin > cap[parents[i]][i] - fl[parents[i]][i])
				flowmin = cap[parents[i]][i] - fl[parents[i]][i];

		for(int i = n; i != 1; i = parents[i]) {
			fl[parents[i]][i] += flowmin;
			fl[i][parents[i]] -= flowmin;
		}

		flow += flowmin;
	}

	printf("%d\n", flow);
	return 0;
}