Cod sursa(job #793744)

Utilizator mihaiSimuSimu Mihai mihaiSimu Data 3 octombrie 2012 22:10:59
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <stdio.h>
#include <vector>
#include <queue>
#include <bitset>
using namespace std;

vector< vector<int> > G(1005);
int n,m;
int a[1005][1005];
int parent[1005];
int f;

int min(int a,int b){return a<b?a:b;}

void doPath(int u,int c){
	if(u==1){
		f=c;
	}
	else{
		doPath(parent[u],min(a[parent[u]][u],c));
		a[parent[u]][u]-=f;
		a[u][parent[u]]+=f;
	}
}

int main(){
	const int INF=1100005;
	bitset <1005> viz;
	int x,y,c,u,v;
	bool found;
	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);
	scanf("%d %d",&n,&m);
	for(int i=0;i<m;i++){
		scanf("%d %d %d",&x,&y,&c);
		a[x][y]=c;G[x].push_back(y);
	}
	long maxFlow=0;
	while(true){
		queue<int> q;q.push(1);viz.reset();viz[1]=true;
		found=false;
		while(!q.empty() && !found){
			u=q.front();q.pop();
			for(int i=0;i<G[u].size();i++){
				if(a[u][G[u][i]]>0 && !viz[G[u][i]]){
					v=G[u][i];parent[v]=u;
					q.push(v);viz[v]=true;
					if(v==n){found=true;break;}
				}
			}
		}
		if(!found)
			break;
		doPath(n,INF);
		
		maxFlow+=f;
	}
	printf("%ld ",maxFlow);	
	return 0;
}