Cod sursa(job #1226726)

Utilizator buzu.tudor67Tudor Buzu buzu.tudor67 Data 6 septembrie 2014 23:40:31
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.13 kb
#include<cstdlib>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fi("maxflow.in");
ofstream fo("maxflow.out");

const int max_n = 1003;

vector <int> a[max_n];
queue <int> q;
int Capacity[max_n][max_n],Flow[max_n][max_n],Max_Flow;
int i,n,m,x,y,c,start_node,end_node,P[max_n];

int augmenting_path(int start_node, int end_node){
     int viz[max_n];
     for(int i=1;i<=n;i++) viz[i]=0;
     
     q.push(start_node);
     viz[start_node]=1;
     P[start_node]=start_node;
     
     while(q.size())
          {
           int x=q.front();
           
           for(int j=0;j<(int)a[x].size();j++)
              {
               int y=a[x][j];
               if(!viz[y] && Capacity[x][y]>Flow[x][y])
                 {
                  q.push(y);
                  viz[y]=1;
                  P[y]=x;
                  if(y==end_node){
                                  while(q.size()) q.pop();
                                  return P[end_node];
                                 }
                 }
              }
           
           q.pop();
          }
     
     return 0;
}

int main(){
    fi>>n>>m;
    for(i=1;i<=m;i++)
       {
        fi>>x>>y>>c;
        a[x].push_back(y);
        a[y].push_back(x);
        Capacity[x][y]=c;
       }
    
    
    start_node=1;
    end_node=n;
    Max_Flow=0;
  
    while(augmenting_path(start_node,end_node))
         {
          int path_capacity=Capacity[P[end_node]][end_node]-Flow[P[end_node]][end_node];  
          
          y=end_node;
          while(y!=P[y])
               {
                if(path_capacity>Capacity[P[y]][y]-Flow[P[y]][y]) 
                   path_capacity=Capacity[P[y]][y]-Flow[P[y]][y];
                y=P[y];
               }
               
          y=end_node;
          while(y!=P[y])
               {
                Flow[P[y]][y]+=path_capacity;
                Flow[y][P[y]]-=path_capacity;
                y=P[y];
               }  
    
          Max_Flow+=path_capacity;  
         }

    fo<<Max_Flow;
    
    fi.close();
    fo.close();
    return 0;
}