Cod sursa(job #1747281)

Utilizator Dan_RadulescuRadulescu Dan Dan_Radulescu Data 24 august 2016 18:03:59
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include<fstream>
#include<stdlib.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int n,m,cost[1001][1001],flux[1001][1001],v[1001];
int BFS(){
   int i,coada[1001],p,u,x;
   p=u=1;
   coada[p]=1;v[1]=1;
   while(p<=u && v[n]==0){
      x=coada[p];
      for (i=1;i<=n;i++)
       if (v[i]==0){
          if (flux[x][i]<cost[x][i]){
            v[i]=x;u++;
            coada[u]=i;
          }
            else
              if (flux[i][x]>0){
                v[i]=-x;
                u++;coada[u]=i;
              }
       }
      p++;
   }
   return v[n];
}
void Edmonds_Karp(){
    int lant[1001],a,b,len,i,val;
   do{
    for (i=1;i<=n;i++)
        v[i]=0;
    if (BFS()==0) return;
    lant[0]=n;len=0;a=900000000;b=900000000;
    while(lant[len]!=1){
        len++;
        lant[len]=abs(v[lant[len-1]]);
        if (v[lant[len-1]]>0) a=min(a,cost[lant[len]][lant[len-1]]-flux[lant[len]][lant[len-1]]);
          else
            b=min(b,flux[lant[len-1]][lant[len]]);
    }
    val=min(a,b);
    for (i=len;i>0;i--)
        if (v[lant[i-1]]>0) flux[lant[i]][lant[i-1]]+=val;
             else
                flux[lant[i-1]][lant[i]]-=val;
   }while(0<1);
}
int main(){
    fin>>n>>m;
    int i,a,b;
    for (i=1;i<=m;i++){
        fin>>a>>b;
        fin>>cost[a][b];
    }
   fin.close();
   Edmonds_Karp();
   int mflow=0;
   for (i=1;i<=n;i++)
    mflow=mflow+flux[i][n];
   fout<<mflow;
   fout.close();
   return 0;
}