Cod sursa(job #1496998)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 5 octombrie 2015 22:11:26
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;

int main(){
	ifstream f("maxflow.in");
	ofstream g("maxflow.out");
	int n, m;
	f >> n >> m;
	vector<vector<int> > cap(n, vector<int>(n, 0)),
		flow(n, vector<int>(n, 0)),
		graf(n);
	for(int i = 0, a, b, c; i < m; ++i){
		f >> a >> b >> c;
		--a, --b;
		cap[a][b] = c;
		graf[a].push_back(b);
		graf[b].push_back(a); }

	vector<int> tata(n, -1);
	vector<bool> e_viz(n, false);
	queue<int> de_viz;
	int rez = 0;

	while(true){
		e_viz[0] = true;
		tata[0] = 0;
		de_viz.push(0);
		while(!de_viz.empty()){
			const int cur = de_viz.front();
			de_viz.pop();
			if(cur != n-1){
				for(const auto next : graf[cur]){
					if(!e_viz[next] && cap[cur][next] - flow[cur][next] > 0){
						e_viz[next] = true;
						de_viz.push(next);
						tata[next] = cur; } } } }

		if(!e_viz[n-1]){
			break; }

		for(auto start : graf[n-1]){
			if(e_viz[start]){
				tata[n-1] = start;
				int min_flow = 200000;
				for(int i = n-1; i != 0; i = tata[i]){
					min_flow = min(min_flow, cap[tata[i]][i] - flow[tata[i]][i]); }
				if(min_flow > 0){
					for(int i = n-1; i != 0; i = tata[i]){
						flow[tata[i]][i] += min_flow;
						flow[i][tata[i]] -= min_flow; }
					rez += min_flow; } } }
		fill(begin(tata), end(tata), -1);
		fill(begin(e_viz), end(e_viz), false); }
	g << rez;
	return 0; }