Cod sursa(job #1496987)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 5 octombrie 2015 21:55:22
Problema Flux maxim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
#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, 0);
	vector<bool> e_viz(n, false);
	queue<int> de_viz;
	int rez = 0;

	while(true){
		e_viz[0] = true;
		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]){
			int min_flow = cap[start][n-1] - flow[start][n-1];
			for(int i = start, j = tata[start]; i != 0; i = j, j = tata[j]){
				min_flow = min(min_flow, cap[j][i] - flow[j][i]); }
			if(min_flow	> 0){
				for(int i = start, j = tata[start]; i != 0; i = j, j = tata[j]){
					flow[j][i] += min_flow;
					flow[i][j] -= min_flow; } }
			rez += min_flow; }
			fill(begin(tata), end(tata), 0);
			fill(begin(e_viz), end(e_viz), false); }
	g << rez;
	return 0; }