Cod sursa(job #1939294)

Utilizator danutbodbodnariuc danut danutbod Data 25 martie 2017 16:28:07
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.11 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';
}