Cod sursa(job #2197887)

Utilizator DenisacheDenis Ehorovici Denisache Data 23 aprilie 2018 01:08:40
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <fstream>
#include <limits.h>
#include <math.h>
#include <queue>
#include <set>
#include <array>
#include <bitset>

using namespace std;

int cap[1005][1005];
int flow[1005][1005];
int prv[1005];
int n, m;

vector<int> G[1005];
bitset<1005> used;

bool bfs(int source, int sink) {
	queue<int> Q;
	used.reset();

	Q.push(source);
	used[source] = 1;

	while (!Q.empty()) {
		int nod = Q.front();
		Q.pop();

		if (nod == n) continue;

		for (auto& dest: G[nod]) {
			if (used[dest]) continue;
			if (flow[nod][dest] < cap[nod][dest]) {
				Q.push(dest);
				prv[dest] = nod;
				used[dest] = 1;
			}
		}
	}

	return used[sink];
}

int edmond_karp(int source, int sink) {
	int res = 0;
	const int INF = int(2e9);

	while (bfs(source, sink)) {
		for (auto& neigh: G[sink]) {
			if (flow[neigh][sink] == cap[neigh][sink] || !used[neigh]) continue;

			int minFlow = INF;

			prv[sink] = neigh;

			for (int i = sink; i != source; i = prv[i]) {
				minFlow = min(minFlow, cap[prv[i]][i] - flow[prv[i]][i]);
			}

			if (minFlow == 0) continue;

			for (int i = sink; i != source; i = prv[i]) {
				flow[prv[i]][i] += minFlow;
				flow[i][prv[i]] -= minFlow;
			}

			res += minFlow;
		}
	}

	return res;
}

int main() {
	ios::sync_with_stdio(false);

	string filename = "maxflow";

	ifstream cin(filename + ".in");
	ofstream cout(filename + ".out");

	cin >> n >> m;

	while (m--) {
		int a, b, c;
		cin >> a >> b >> c;

		G[a].push_back(b);
		G[b].push_back(a);

		cap[a][b] = c;
		cap[b][a] = 0;

		flow[a][b] = 0;
		flow[b][a] = 0;
	}

	cout << edmond_karp(1, n);

	//system("pause");
	return 0;
}