Cod sursa(job #3328576)

Utilizator ninelcatelALEXANDRU-NICOLAS NEGRISAN ninelcatel Data 9 decembrie 2025 12:36:36
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <bits/stdc++.h>
    const int NMAX = 1e3;
    std::vector<int> Ladj[NMAX+1];
    int L[NMAX+1][NMAX+1];
    int flux[NMAX+1][NMAX+1];
    int vis[NMAX+1];
    int n,m;
    int p[NMAX+1];
int bfs(int s, int dest){
    for(int i = 1; i<=n ; i++)
        {vis[i]=0;
        p[i]=0;
        }
    std::queue<int> q;
    q.push(s);
    
    vis[s]=1;
    while(!q.empty()){
        int nod = q.front();
        q.pop();
        for(auto vecin : Ladj[nod]){
            if(!vis[vecin] && L[nod][vecin] - flux[nod][vecin] > 0){
                vis[vecin] = 1;
                p[vecin] = nod;
                q.push(vecin);
            }
        }
    }
    if(!vis[dest]){
        return 0;
    }    
    std::vector<int> path;
    int x = dest;
    while(x!=0){
        path.push_back(x);
        x=p[x];
    }
    std::reverse(path.begin(),path.end());
    int flow = 1e9;
    for(int i =0;i<path.size()-1;i++){
        int a = path[i];
        int b= path[i+1];
        flow = std::min(flow,L[a][b]-flux[a][b]);
    }
    for(int i =0;i<path.size()-1;i++){
        int a = path[i];
        int b= path[i+1];
        flux[a][b] += flow;
        flux[b][a] -= flow;
    }
    return flow;
}

int main(){
    std::ifstream fin("maxflow.in");
    std::ofstream fout("maxflow.out");
    fin>>n>>m;
    for(int i=1; i<=m;i++){
        int a,b,w;
        fin >> a >> b >> w;
        L[a][b]=w;
        Ladj[a].push_back(b);
        Ladj[b].push_back(a);
    }
    int maxflow = 0;
    while(true) {
        int flow = bfs(1, n);
        if(flow == 0) {
            break;
        }
        maxflow += flow;
    }
    fout<<maxflow;
    fin.close();
    fout.close();
}