Cod sursa(job #240478)

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

int 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("graf.in","r",stdin);
     freopen("graf.out","w",stdout);

     int i,j,x,y,vv;
     scanf("%d %d",&n,&m);
//     s=1;d=4;
     //trebuie aflata pozitia de start(s) si pozitia de final (d)
     //neaparat:P
     for (i=1;i<=m;i++){
         scanf("%d %d %d",&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(){
     int 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=30000;

        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;
        }
     }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);
}