Cod sursa(job #2697653)

Utilizator gavra_bogdanBogdan Gavra gavra_bogdan Data 19 ianuarie 2021 11:25:10
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define vi std::vector<int>
#define vvi std::vector<vi>
#define pi std::pair<int, int>

using namespace std;

const int inf = 1e9;
int n, m;
vvi cap, l;

int bfs(int source, int sink, vi& t){
	for(int i=0;i<t.size();i++) t[i] = -1;
	t[source] = -2;
	std::queue<pi>q;
	q.push({source, inf});
	while(!q.empty()){
		int curr = q.front().first, flow = q.front().second;
		q.pop();
		for(auto x:l[curr])
			if(t[x] == -1 and cap[curr][x]) {
				t[x] = curr;
				int aux = min(flow, cap[curr][x]);
				if(x == sink) return aux;
				q.push({x, aux});
			}
	}
	return 0;
}

int flow(int source, int sink){
	int ans = 0, aux = 0;
	vi t(n + 1);
	while(1){
		aux = bfs(source, sink, t);
		if(aux == 0) break;
		ans += aux;
		int curr = sink;
		while(curr != source){
			cap[t[curr]][curr] -= aux;
			cap[curr][t[curr]] += aux;
			curr = t[curr];
		}
	}
	return ans;
}

void pre(){
	l.resize(n + 1);
	cap.resize(n + 1);
	for(int i=1;i<=n;i++) cap[i].resize(n + 1);
}

int main(){
	std::ifstream fin("maxflow.in");
	std::ofstream fout("maxflow.out");
	fin>>n>>m;
	pre();
	for(int i=1;i<=m;i++){
		int a, b, c;
		fin>>a>>b>>c;
		l[a].push_back(b);
		l[b].push_back(a);
		cap[a][b] = c;
	}
	fout<<flow(1, n);
}