Cod sursa(job #2933199)

Utilizator lolismekAlex Jerpelea lolismek Data 4 noiembrie 2022 20:01:35
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <iomanip>
#include <queue>

using namespace std;

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

const int NMAX = 1000;
const int INF = 1e9;

vector <int> adj[NMAX + 1];

int n, m;
int f[NMAX + 1][NMAX + 1];
int parent[NMAX + 1];

bool viz[NMAX + 1];

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;
			int 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;
}