Cod sursa(job #2640382)

Utilizator KlinashkaDiacicov Calin Marian Klinashka Data 6 august 2020 12:00:26
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;

const int INF=(int)1e9;
const int NMAX=(int)1e3;
int N, cap[NMAX+1][NMAX+1], par[NMAX+1];
vector<int> adj[NMAX+1];

void citire() {
	int M;
	scanf("%d %d", &N, &M);
	for(int i=1;i<=M;++i) {
		int a, b;
		scanf("%d %d", &a, &b);
		adj[a].push_back(b);
		adj[b].push_back(a);
		scanf("%d", &cap[a][b]);
	}
}

bool bfs() {
	par[1]=0;
	for(int i=2;i<=N;++i)
		par[i]=-1;
	queue<int> q;
	q.push(1);
	while(!q.empty()) {
		int v=q.front();
		q.pop();
		for(auto e:adj[v]) {
			if(cap[v][e]>0 && par[e]==-1) {
				par[e]=v;
				q.push(e);
			}
		}
	}
	return (par[N]!=-1);
}

int main() {
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);
	citire();
	int flow=0;
	while(bfs()) {
		vector<int> nodes;
		int cur=N;
		while(cur>1) {
			nodes.push_back(cur);
			cur=par[cur];
		}
		nodes.push_back(1);
		reverse(nodes.begin(), nodes.end());
		int mn=INF, sz=(int)nodes.size();
		for(int i=0;i<sz-1;++i) {
			mn=min(mn, cap[nodes[i]][nodes[i+1]]);
		}
		flow+=mn;
		for(int i=0;i<sz-1;++i) {
			cap[nodes[i]][nodes[i+1]]-=mn;
			cap[nodes[i+1]][nodes[i]]+=mn;
		}
	}
	printf("%d\n", flow);
	return 0;
}