Cod sursa(job #2888872)

Utilizator lolismekAlex Jerpelea lolismek Data 11 aprilie 2022 21:54:40
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>

using namespace std;

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

const int N = 1000, inf = 1e9;
vector <int> adj[N + 1];
int cap[N + 1][N + 1], flux[N + 1][N + 1], parent[N + 1], n, m;

bitset <N + 1> viz;

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

	queue <int> q;

	q.push(1);
	viz[1] = 1;

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

		for(auto vec : adj[nod]){
			if(!viz[vec] && cap[nod][vec] - flux[nod][vec] > 0){
				parent[vec] = nod;
				viz[vec] = 1;
				q.push(vec);
			}
		}
	}

	return viz[n];
}

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);
		cap[a][b] = c;
	}

	int max_flow = 0;
	while(bfs()){
		for(auto vec : adj[n]){
			if(cap[vec][n] - flux[vec][n] <= 0 || !viz[vec])
				continue;

			int mini = inf, nod = n;

			while(nod != 1){
				mini = min(mini, cap[parent[nod]][nod] - flux[parent[nod]][nod]);
				nod = parent[nod];
			}

			if(mini == 0)
				continue;

			nod = n;
			while(nod != 1){
				flux[parent[nod]][nod] += mini;
				flux[nod][parent[nod]] -= mini;
				nod = parent[nod];
			}

			max_flow += mini;

		}
	}

	fout << max_flow;

	return 0;	
}