Cod sursa(job #2915320)

Utilizator lolismekAlex Jerpelea lolismek Data 22 iulie 2022 14:05:26
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
// retelistica nesimtita
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

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

const int N = 1000, inf = 1e9;
vector <int> adj[N + 1];
int f[N + 1][N + 1], parent[N + 1];
bool viz[N + 1];

int n, m;

bool BFS(){
	for(int i = 1; i <= n; i++)
		parent[i] = viz[i] = 0;

	queue <int> Q;

	Q.push(1);
	viz[1] = true;

	while(!Q.empty()){
		int nod = Q.front();
		Q.pop();

		if(nod == n)
			return true;

		for(auto vec : adj[nod])
			if(!viz[vec] && f[nod][vec] > 0)
				parent[vec] = nod, viz[vec] = true, Q.push(vec);
	}

	return false;
}

int main(){

	fin >> n >> m;

	for(int i = 1; i <= m; i++){
		int a, b, c;
		fin >> a >> b >> c;
		adj[a].push_back(b);
		adj[b].push_back(a);
		f[a][b] = c;
	}

	int maxFlow = 0;
	while(BFS()){
		for(auto vec : adj[n]){
			if(f[vec][n] <= 0 || !viz[vec])
				continue;

			parent[n] = vec;

			int mini = inf, nod = n;
			while(nod != 1)
				mini = min(mini, f[parent[nod]][nod]), nod = parent[nod];

			if(mini == 0)
				continue;

			nod = n;

			while(nod != 1)
				f[parent[nod]][nod] -= mini, f[nod][parent[nod]] += mini, nod = parent[nod];

			maxFlow += mini;
		}
	}

	fout << maxFlow << '\n';

	return 0;
}