Cod sursa(job #1938705)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 25 martie 2017 00:53:12
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <bits/stdc++.h>
using namespace std;

ifstream f("maxflow.in");
ofstream g("maxflow.out");

#define LE 1066
int M[LE][LE];
int infinit=100000000;
bool viz[LE];
int n,m;
int father[LE];
int drum[LE];

void dfs(int nod){
   viz[nod]=true;

   for(int i=1;i<=n;++i){
      if (viz[i]==false){ 
        if (M[nod][i]>0){
           dfs(i);
           father[i]=nod;     
        }
      }
   }
}


int main(){
  f>>n>>m;
  
  for(int i=1;i<=m;++i){
     int xx,yy,cc;
     f>>xx>>yy>>cc;
     M[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;
    }

    //gasire drum (in ordine inversa)
    int node=n;
    int nr_noduri_drum=0;
    while (node!=1){
        drum[++nr_noduri_drum]=node;
        node=father[node];
    }
    drum[++nr_noduri_drum]=1;
    
    // inversare drum
    for(int st=1,dr=nr_noduri_drum;st<dr;++st,--dr){
       swap(drum[st],drum[dr]);
    }
    
    // gasire cost muchie minima
    int fmax=infinit;
    for(int i=1;i<nr_noduri_drum;++i){
       fmax=min(fmax,M[drum[i]][drum[i+1]]);
    }

   // modificare graf
    for(int i=1;i<nr_noduri_drum;++i){
       M[drum[i]][drum[i+1]]-=fmax;
       M[drum[i+1]][drum[i]]+=fmax;
    }
   
    flux_final+=fmax;
  }
 
   
  g<<flux_final<<'\n';

}