Cod sursa(job #2197772)

Utilizator DenisacheDenis Ehorovici Denisache Data 22 aprilie 2018 21:08:49
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 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];

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();

		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)) {
		int minFlow = INF;

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

		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");

	int n, m;
	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;
}