Cod sursa(job #1522648)

Utilizator afkidStancioiu Nicu Razvan afkid Data 11 noiembrie 2015 21:23:02
Problema Flux maxim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <bits/stdc++.h>
#define N 1024

using namespace std;
struct Edge{
	int v;
	int cap;
	int flow;
	int rev;
	Edge(){}
	Edge(int v,int cap,int flow,int rev):v(v),cap(cap),flow(flow),rev(rev){}
};
int n,m;
vector<Edge> g[N];
bool vis[N];

bool dfs(int v,int flow)
{
	if(v==n) return true;
	if(vis[v]) return false;
	vis[v]=true;
	for(int u=0;u<g[v].size();++u)
	{
		if(g[v][u].cap-g[v][u].flow>=flow && dfs(g[v][u].v,flow))
		{
			g[v][u].flow+=flow;
			g[g[v][u].v][g[v][u].rev].flow-=flow;
			return true;
		}
	}
	return false;
}

int a,b,d;

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);
	cin>>n>>m;
	for(int i=0;i<m;++i)
	{
		cin>>a>>b>>d;
		Edge e1(b,d,0,g[a].size());
		Edge e2(a,0,0,g[b].size());
		g[a].push_back(e1);
		g[b].push_back(e2);
	}
	int flow=(1<<17);
	int ans=0;
	while(flow>0)
	{
		fill(vis,vis+n+1,false);
		if(dfs(1,flow))
			ans+=flow;
		else
			flow>>=1;
	}
	cout<<ans<<"\n";
	return 0;
}