Cod sursa(job #2961444)

Utilizator R3v1v3RAlexe Paul R3v1v3R Data 6 ianuarie 2023 15:13:30
Problema Flux maxim Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <bits/stdc++.h>

using namespace std;

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

int n,m;
vector< vector<int > > edges;
int cap[1005][1005];
int flow[1005][1005];
vector<int> arb;
vector<int> vis;
int maxFlow;

bool bfs(){
	fill(arb.begin(), arb.end(),0);
	fill(vis.begin(), vis.end(),0);
	arb[1] = 1;
	vis[1] = 1;
	queue<int> q;
	q.push(1);
	while(!q.empty()){
		int curr = q.front();
		q.pop();

		if(curr == n)
			return true;
		
		for(int i = 0; i < edges[curr].size(); ++i){
			if(vis[edges[curr][i]] == 0 && flow[curr][edges[curr][i]] < cap[curr][edges[curr][i]]){
				arb[edges[curr][i]] = curr;
				vis[edges[curr][i]] = 1;
				q.push(edges[curr][i]);
			}
		}
	}
	return false;
}

int main(){
	fin >> n >> m;
	edges.resize(n+5);
	arb.resize(n+5);
	vis.resize(n+5);

	int a,b,c;

	for(int i = 0; i < m; ++i){
		fin >> a >> b >> c;
		edges[a].push_back(b);
		edges[b].push_back(a);
		cap[a][b] = c;
	}
	while(bfs()){
		int fl = INT_MAX;
		for(int i = 0; i <= edges[n].size(); ++i){
			if(vis[edges[n][i]] == 1){
				arb[n] = edges[n][i];
				for(int j = n; j != 1; j = arb[j]){
					fl = min(fl, cap[arb[j]][j]-flow[arb[j]][j]);
				}
				if(fl != 0){
					for(int j = n; j != 1; j = arb[j]){
						flow[arb[j]][j] += fl;
						flow[j][arb[j]] -= fl;
					}
					maxFlow += fl;
				}
			}
		}
	}
	fout << maxFlow;
}