Cod sursa(job #241283)

Utilizator runnaway90Oprescu Radu Constantin runnaway90 Data 9 ianuarie 2009 18:50:45
Problema Flux maxim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
#include<stdio.h>
#define N 50
#define min(x,y) ((x)<(y)? (x) : (y))
#define abs(x) ((x)>0 ? (x) : (-x))

long n, m, s, d, ok, fol[N], viz[N], q[N],
c[N][N],
f[N][N];

void citire();
void rezolva();
void afisare();
int bfs();

int main(){
    citire();
    rezolva();
    afisare();
    return 0;
}

void citire(){
     freopen("maxflow.in","r",stdin);
     freopen("maxflow.out","w",stdout);

     long i,j,x,y,vv;
     scanf("%ld %ld",&n,&m);
     for (i=1;i<=m;i++){
	 scanf("%ld%ld%ld",&x,&y,&vv);
	 c[x][y]=vv;
     }

     for (i=1;i<=n;i++){
	 ok=0;
	 for (j=1;j<=n;j++)
	     if (c[i][j]!=0)
		ok=1,fol[j]=1;
	 if (!ok) d=i;
     }
     for (i=1;i<=n;i++)
	 if (!fol[i]){
	    s=i;break;}
}

void rezolva(){
long i, a, b, lg, v, L[N];
     do{
	for (i=1;i<=n;i++) viz[i]=0;

	if (bfs()) return;

	L[0]=d;lg=0;

	a=b=2000000;

	while (L[lg]!=s)
        {
              ++lg;
              L[lg]=abs(viz[L[lg-1]]);
              if (viz[L[lg-1]]>0)
                 a=min(a,c[L[lg]][L[lg-1]]-f[L[lg]][L[lg-1]]);
              else
                  if (viz[L[lg-1]]<0)
                     b=min(b,f[L[lg-1]][L[lg]]);               
        }
        v=min(a,b);
        for (i=lg;i>0;i--){
            if (viz[L[i-1]]>0)
               f[L[i]][L[i-1]]+=v;
            else
		f[L[i-1]][L[i]]-=v;
	  //  printf("%d ",L[i]);
	}
        //printf("%d\n",L[0]);
     }while (1);
}

int bfs(){
     int p,u,i,x;
     q[0]=s;viz[s]=1;
     for (p=0,u=0;p<=u;p++){
         x=q[p];
         for (i=1;i<=n;i++)
             if (!viz[i])
                if (f[x][i]<c[x][i]){
                   viz[i]=x;
                   q[++u]=i;
                }
                else
                if (f[i][x]>0){
                   viz[i]=-x;q[++u]=i;
                }
     }
     return !viz[d];
}

void afisare(){
     int i,vf=0;
     for (i=1;i<=n;i++) vf+=f[s][i];
     printf("%d\n",vf);
}