Cod sursa(job #276228)

Utilizator petrecgClinciu Glisca Petre petrecg Data 10 martie 2009 23:08:14
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include<stdio.h>   
#include <string.h>   
int p,u,s[1001],i,n,parinte[1001],c[1001][1001],m,x,y,z,fluxm,min;
int bf()   
{ p=1; u=1; s[p]=1;   
  while(p<=u)   
   {for(i=1;i<=n;i++) if(!parinte[i]&&c[s[p]][i]&&i!=1) { u++; s[u]=i; parinte[i]=s[p]; }   
    p++;   
   }   
  if(parinte[n])return 1;else return 0;   
}   
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);   
     c[x][y]=z;   
   }   
  while(bf())   
   {for(i=1;i<=n;i++)
    {
     if(parinte[i]<=0||c[i][n]<=0)continue;
     min=c[i][n]; x=i;
     while(parinte[x])
      { if(c[parinte[x]][x]<min) min=c[parinte[x]][x];
     x=parinte[x];
      }
     x=i;fluxm+=min;c[i][n]-=min;c[n][i]+=min;
     while(parinte[x])
      { c[parinte[x]][x]-=min;
    c[x][parinte[x]]+=min;
    x=parinte[x];
      }
     memset(parinte,0,sizeof(parinte));
    }
   }
 printf("%d",fluxm);
 fclose(stdout);   
 return 0;   
}