Cod sursa(job #795273)

Utilizator mihaiSimuSimu Mihai mihaiSimu Data 7 octombrie 2012 22:54:03
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 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);G[y].push_back(x);
	}
	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();if(u==n) continue;
			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(!viz[n])
			break;
		for(int i=0;i<G[n].size();i++){
			if(a[G[n][i]][n]>0 && viz[G[n][i]])
			{	parent[n]=G[n][i];
				doPath(n,INF);
				maxFlow+=f;
			}
		}
		//doPath(n,INF);
		
		//maxFlow+=f;
	}
	printf("%ld ",maxFlow);	
	return 0;
}