Cod sursa(job #2900851)

Utilizator Stefan_PiscuPiscu Stefan Constantin Stefan_Piscu Data 12 mai 2022 11:21:46
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <bits/stdc++.h>
using namespace std;

#define cin fin
#define cout fout
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

struct edge{
	int from, to, flow, cap;
};

struct Dinic{
	

	int n;
	int s, t;	
	vector<int> v;
	vector<int> level, ptr;
	vector<edge> edges;
	vector<vector<int>> out;

	Dinic(int _n, int _s, int _t){
		n=_n, s=_s, t=_t;
		v.resize(n+1);
		level.resize(n+1);
		ptr.resize(n+1);
		out.resize(n+1);
	}


	void addEdge(int from, int to, int cap) {
		out[from].push_back(edges.size());
		edges.push_back({from, to, 0, cap});
		out[to].push_back(edges.size());
		edges.push_back({to, from, 0, 0});
	}


	bool bfs(){
		queue<int> q;
		q.push(s);
		fill(level.begin(), level.end(), -1);
		level[s]=0;
		fill(ptr.begin(), ptr.end(), 0);
		while(!q.empty()){
			int cr=q.front();
			q.pop();
			for(auto it:out[cr]){
				int ncr=edges[it].to;
				if((level[ncr]!=-1)||(edges[it].cap==edges[it].flow)) continue;
				level[ncr]=level[cr]+1;
				q.push(ncr);
			}
		}
		return level[t]!=-1;
	}

	int dfs(int x, int sent=1e9){
		if(sent==0) return 0;
		if(x==t) return sent;
		for(int& cr=ptr[x];cr<out[x].size();cr++){
			int cre=out[x][cr];	
			auto& e=edges[cre];
			if((level[e.to]!=level[e.from]+1)) continue;
			int newSent=min(sent, e.cap-e.flow);
			int actuallySent=dfs(e.to, newSent);
			if(actuallySent!=0){
				e.flow+=actuallySent;
				edges[cre^1].flow-=actuallySent;
				return actuallySent;
			}
		}
		return 0;
	}

	int getFlow(){
		int flow=0;
		while(bfs()){
			int sent;
			while(sent=dfs(s)) flow+=sent;
		}
		return flow;
	}

};

int main(){
	int n, m;
	cin>>n>>m;
	Dinic flowNet(n, 1, n);
	for(int i=1;i<=m;++i){
		int a, b, c;
		cin>>a>>b>>c;
		flowNet.addEdge(a, b, c);
	}
	cout<<flowNet.getFlow()<<"\n";
	return 0;
}