Cod sursa(job #1153162)

Utilizator iarbaCrestez Paul iarba Data 25 martie 2014 11:55:55
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <cstdio>
using namespace std;
int poz,sfq,i,t,n,m,aux,x,y,j,fmax;
int bfs[1001][2],viz[1001],next[10001],dest[10001],cost[1001][1001],st[1001],sf[1001],f[1001];
int min(int a, int b){if(a>b){return b;}return a;}
void parcurge()
{
	for(poz=1;poz<=sfq;poz++){
		for(i=st[bfs[poz][0]];i;i=next[i]){
			if((cost[bfs[poz][0]][dest[i]])&&(viz[dest[i]]!=t)){
				f[++sfq]=min(f[poz],cost[bfs[poz][0]][dest[i]]);
				bfs[sfq][0]=dest[i];
				bfs[sfq][1]=poz;
				viz[dest[i]]=t;
				if(bfs[sfq][0]==n){
					aux=sfq;fmax+=f[sfq];
					for(j=bfs[sfq][1];j;j=bfs[j][1]){
						cost[bfs[j][0]][bfs[aux][0]]-=f[sfq];
						cost[bfs[aux][0]][bfs[j][0]]+=f[sfq];
						aux=j;
													}
					return;
								  }
										  }
										  }
							 }
	
}
void add(int x,int y)
{
	if(st[x]){next[sf[x]]=poz;}
	else{st[x]=poz;}
	next[poz]=0;dest[poz]=y;sf[x]=poz;
}
int main()
{
	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);
	scanf("%ld%ld",&n,&m);
	for(i=1;i<=m;i++){
		scanf("%ld%ld%ld",&x,&y,&aux);cost[x][y]=aux;
			poz++;add(x,y);
			poz++;add(y,x);
					 }
	t=0;
	do{
		t++;viz[1]=t;
		sfq=1;bfs[1][0]=1;f[1]=111111;
		parcurge();
	}while(viz[n]==t);
	printf("%ld",fmax);
return 0;
}