Cod sursa(job #1939298)

Utilizator danutbodbodnariuc danut danutbod Data 25 martie 2017 16:29:32
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.1 kb
//var I Edmonds-Karp 70p timpul!!
//drumul de ameliorare facut cu BFS
#include <fstream>
using namespace std;
 #define MAX 1003
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int A[MAX][MAX];
int infinit=100000000;
int viz[MAX],C[5*MAX];
int n,m;
int T[MAX];

void BFS(int nod){
   int p,i,u;
   for(i=1;i<=n;i++)viz[i]=0;
   p=u=1;
   C[1]=1;
   while(p<=u){
     nod=C[p];p++;
     for(i=1;i<=n;i++)
       if(A[nod][i]>0 and viz[i]==0)
               {C[++u]=i;
                viz[i]=1;
                T[i]=nod;
                }
   }
}
int main(){
  f>>n>>m;
  for(int i=1;i<=m;++i){
     int xx,yy,cc;
     f>>xx>>yy>>cc;
     A[xx][yy]=cc;
  }
  int flux_final=0;
  while (true){
    BFS(1);
    if (viz[n]==0)break;
    int fmax=infinit;
    int i=n;
    while (i!=1){
        fmax=min(fmax,A[T[i]][i]);
        i=T[i];
    }
    i=n;
    while (i!=1){
       A[T[i]][i]-=fmax;
       A[i][T[i]]+=fmax;
       i=T[i];
     }
    flux_final+=fmax;
  }
  g<<flux_final<<'\n';
}

////var I Ford Fulkerson  60p timpul!!
//drumul de ameliorare facut cu DFS
//#include <fstream>
//using namespace std;
// #define MAX 1003
//ifstream f("maxflow.in");
//ofstream g("maxflow.out");
//int A[MAX][MAX];
//int infinit=100000000;
//bool viz[MAX];
//int n,m;
//int T[MAX];
//
//void dfs(int nod){
//   viz[nod]=true;
//   for(int i=1;i<=n;++i){
//      if (viz[i]==false){
//        if (A[nod][i]>0){
//           T[i]=nod;
//           dfs(i);
//           }
//      }
//   }
//}
//int main(){
//  f>>n>>m;
//  for(int i=1;i<=m;++i){
//     int xx,yy,cc;
//     f>>xx>>yy>>cc;
//     A[xx][yy]=cc;
//  }
//  int flux_final=0;
//  while (true){
//    for(int i=1;i<=n;++i){
//       viz[i]=false;
//    }
//    dfs(1);
//    if (viz[n]==false)break;
//    int fmax=infinit;
//    int i=n;
//    while (i!=1){
//        fmax=min(fmax,A[T[i]][i]);
//        i=T[i];
//    }
//    i=n;
//    while (i!=1){
//       A[T[i]][i]-=fmax;
//       A[i][T[i]]+=fmax;
//       i=T[i];
//     }
//    flux_final+=fmax;
//  }
//  g<<flux_final<<'\n';
//}