Cod sursa(job #2960874)

Utilizator iulitaalpetriIulita Alpetri iulitaalpetri Data 5 ianuarie 2023 05:32:50
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.96 kb

#include <iostream>
#include <fstream> 
#include <vector>
#include <queue>
#define inf 9999999

using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out"); 
vector<vector<int>> lista_ad, capacitate; 
vector<int> tata; 
int n, m, t, s;


bool bfs(){// verificam daca parcurgerea care incepe din s se termina in t
    
    vector<bool> vizitat(n+ 1, false); 
    queue<int> coada; 
    
    coada.push(s); // incepem de la sursa 
    vizitat[s]= true; 
    tata[s]= -1; 
    
    while(!coada.empty()){
        
        int u= coada.front(); 
        coada.pop(); 
        
        for(auto v: lista_ad[u]){
            
            
            if(vizitat[v]== false && capacitate[u][v]!=0){
            tata[v]= u;
            if(v==t) return true; 
            
            vizitat[v]= true; 
            coada.push(v);
            
            }
        }
        
        
    }
    
    return false;
}



int edmonds_karp(){
    
    int flow_max= 0; 
    
    
    while(bfs()){
        
        int u, v=t; 
        
        int flow_path= inf;
        
        
        while(v!= s){
            u= tata[v]; 
            
            if(capacitate[u][v]< flow_path)
                flow_path= capacitate[u][v]; // calculam cap min pt fiecare parcurgere
            
            v= tata[v];
        }
        
        v = t; 
        
        while( v!=s ){
            u= tata[v]; 
            capacitate[u][v]-=flow_path; 
            capacitate[v][u]+= flow_path;
            v= tata[v];
        }
        flow_max+= flow_path;
    }
    return flow_max;
    
    
}


int main()
{
    
    int u, v, capac;
    
    f>>n>>m; 
    t=n; 
    s= 1; 
    
    
    lista_ad.resize(n+1); 
    tata.resize(n+1); 
    capacitate.resize(n+ 1, vector<int>(n+1)); 
    
    
    for(int i=1; i<=m; i++){
        f>>u>>v>>capac; 
        lista_ad[u].push_back(v); 
        lista_ad[v].push_back(u); 
        capacitate[u][v]= capac;
    } 
    
    g<<edmonds_karp();
   

    return 0;
}