Cod sursa(job #780557)

Utilizator ionut_blesneagIonut Blesneag ionut_blesneag Data 20 august 2012 19:35:09
Problema Flux maxim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include<cstdio>
#include<list>
using namespace std;

const int inf=1000000;
int i,j,ka,kb,N,M;
list<int> L[1001];
list<int>::iterator it;
int viz[1001];
int cap[1001][1001];
int flux[1001][1001];
int lant[1001];
int t[1001];
int fluxmax,lungime_lant;
int minim,x,y,z,gasit;

void mem_set()
{for(i=1; i<=N; i++)
  viz[i]=0;}

int BFS()
{mem_set();
lungime_lant=1;
lant[1]=1;
gasit=0;
i=1;
while(i<=lungime_lant)
{ka=lant[i];
for(it=L[ka].begin(); it!=L[ka].end(); it++)
 {kb=*it;
  if(viz[kb]==0 && cap[ka][kb]>flux[ka][kb])
    {viz[kb]=1;
     lungime_lant++;
     lant[lungime_lant]=kb;
     if(kb==N)  gasit=1;
     t[kb]=ka;
     }
  }
i++;}
return gasit;
}

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);
 cap[x][y]=z;
 L[x].push_back(y);
 L[y].push_back(x);}
 
while(BFS())
{for(it=L[N].begin(); it!=L[N].end(); it++)
   {kb=*it;
    if(viz[kb]==1 && cap[ka][kb]>flux[ka][kb])
    t[N]=kb;

 minim=inf;
 for(i=N; i!=1; i=t[i])
 {if(cap[t[i]][i]-flux[t[i]][i]<minim)
    minim=cap[t[i]][i]-flux[t[i]][i];}
 
 for(i=N; i!=1; i=t[i])
 {flux[t[i]][i]+=minim;
  flux[i][t[i]]-=minim;}
 
 fluxmax+=minim;  
 }
} 
printf("%d",fluxmax); 
return 0;}