Cod sursa(job #250754)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 31 ianuarie 2009 19:03:15
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <stdio.h>
#include <bitset>
#define INF 2147000000
using namespace std;
struct muchie{int x,y;}a[5005];
int n,m,i,j,x,y,z,flux,aux,minim,nod;
int g[1024],t[1024],path[1024],cap[1005][1024];
int * v[1005];
bitset<1024>mark;

bool BFS(){
 int i,nod,fiu,p=1,q=1,que[1024];
 mark.reset();
 que[1]=1;mark[1]=1;
 while (p<=q){
		nod=que[p];
    for (i=0;i<g[nod];++i){
			 fiu=v[nod][i];
			 if (!mark[fiu])
				 if (cap[nod][fiu]){
				   que[++q]=fiu;t[fiu]=nod;mark[fiu]=1;
				 }
		}
		p++;
 }
return mark[n];
}

int main(){
 freopen("maxflow.in","r",stdin);
 freopen("maxflow.out","w",stdout);
 scanf("%d %d",&n,&m);
 for (i=1;i<=m;++i){
	  scanf("%d %d %d",&x,&y,&z);
		g[x]++; g[y]++; cap[x][y]=z;
		a[i].x=x; a[i].y=y;
 }
 for (i=1;i<=n;++i)v[i]=(int*)malloc(g[i]*sizeof(int)),g[i]=0;
 for (i=1;i<=m;++i){ x=a[i].x; y=a[i].y; v[x][g[x]++]=y; v[y][g[y]++]=x;}
 //////////////
 flux=0;
 do{
	 if ( !BFS() )break;
	 for (i=0; i<g[n]; ++i){
		 nod=v[n][i];
		 if (!cap[nod][n] || !mark[nod] )continue;
		 m=0; aux=n; minim=INF;
		 while (aux){path[++m]=aux;aux=t[aux];}
		 for (j=1;j<m;++j)
				if (minim > cap[path[j+1]][path[j]] ) minim=cap[path[j+1]][path[j]];
		 for (j=1;j<m;++j){
				cap[path[j+1]][path[j]]-=minim;
				cap[path[j]][path[j+1]]+=minim;
		 }
		 flux+=minim;
	 }
 }while (1);
 printf("%ld\n",flux);
return 0;
}