Cod sursa(job #2216712)

Utilizator flibiaVisanu Cristian flibia Data 27 iunie 2018 18:48:58
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <bits/stdc++.h>
#pragma GCC optimize("03")
#define N 1010

using namespace std;

ifstream in("maxflow.in");
ofstream out("maxflow.out");

int n, m, x, y, c, E[N << 4], e[N << 4], dad[N], flow, maxflow;
vector <pair <int, int> > v[N];
queue <int> q;
bool viz[N];

bool bfs(){
	memset(viz, 0, sizeof viz);
	while(q.size())
		q.pop();
	q.push(1);
	viz[1] = 1;
	while(q.size()){
		int from = q.front();
		q.pop();
		if(from == n)
			continue;
		for(auto to : v[from]){
			if(!viz[to.first] && E[to.second] > 0){
				dad[to.first] = from;
				viz[to.first] = 1;
				e[to.first] = to.second;
				q.push(to.first);
			}
		}
	}
	return viz[n];
}

int main(){
	in >> n >> m;
	for(int i = 1; i <= m; i++){
		in >> x >> y >> c;
		v[x].push_back(make_pair(y, i << 1));
		v[y].push_back(make_pair(x, (i << 1) | 1));
		E[i << 1] = c;
	}	
	while(bfs()){
		maxflow = 123456;
		for(int i = n; dad[i] != 0; i = dad[i])
			maxflow = min(maxflow, E[e[i]]);
		for(int i = n; dad[i] != 0; i = dad[i]){
			E[e[i]] -= maxflow;
			E[e[i] ^ 1] += maxflow;
		}
		flow += maxflow;
	}
	out << flow;
	return 0;
}