Cod sursa(job #287624)

Utilizator razyelxrazyelx razyelx Data 24 martie 2009 23:33:22
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream.h>
#define Nmax 1001
#define inf 1<<30
ifstream in("maxflow.in");
ofstream out("maxflow.out");

int n,m,flux,min;
int C[Nmax][Nmax], F[Nmax][Nmax],viz[Nmax],Q[Nmax],d[Nmax];

void citire(){
     int x,y,c,i,j;
     in>>n>>m;
     while(in>>x>>y>>c)C[x][y] = c;
}
int bfs(){
    int p,u,i;
    p = u = 1;
    Q[p]   = 1;
    viz[i] = 1;
    d[1]   = inf;
    while(p<=u){
	 for(i=1;i<=n;++i)
	    if(!viz[i] && C[Q[p]][i]-F[Q[p]][i] > 0){
	      viz[i] = Q[p];
	      Q[++u] = i;
	      if(d[Q[p]] < C[Q[p]][i] - F[Q[p]][i])
		 d[i] = d[Q[p]];
	      else d[i] = C[Q[p]][i] - F[Q[p]][i];
	      if(i==n) return 0;
	    }
	 p++;
    }
}

void init(){
     for(int i=1;i<=n;++i) d[i] = viz[Nmax] = Q[i] = 0;
}

void ek(){
     int i,j;
     do{

       init();
       bfs();
       if(viz[n]){
	 min = inf;

	 i = n; j = d[i];
	 /*while(j!=0){
	      if(C[j][i]-F[j][i] < min) min = C[j][i]-F[j][i];
	      i = j;
	      j = d[i];
	 } */
	 i = n; j = viz[i]; min = d[n];
	 while(j!=0){
	      F[j][i] += min;
	      F[i][j] -= min;
	      //out<<j<<" "<<i<<" "<<min<<",";
	      i = j;
	      j = viz[i];
	 }
	 //out<<"\n";
	 flux += min;
       }

     }while(viz[n]);
}
void afisare(){
     out<<flux;
}
int main(){
    citire();
    ek();
    afisare();
    return 0;
}