Cod sursa(job #2815410)

Utilizator oporanu.alexAlex Oporanu oporanu.alex Data 9 decembrie 2021 16:17:36
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <bits/stdc++.h>
using namespace std;

int const nmax = 1005;
int f[nmax][nmax];
int cap[nmax][nmax];
bool BFmaxFlow(int s, int t, int* dad, vector<int>* adj, int V){
    bool vis[nmax];
    for(int i = 1; i <= nmax; ++i)
        vis[i] = false;
    queue<int> q;
    q.push(s);
    vis[s] = true;
    while(!q.empty()){
        int crt = q.front();
        q.pop();
        for(auto i : adj[crt]){
            if(cap[crt][i] > f[crt][i] && vis[i] == false){
                    vis[i] = true;
                    q.push(i);
                    dad[i] = crt;
                    if(i == t)
                        return true;
            }
        }
    }

    return false;
}
int main(){
    ifstream fin("maxflow.in");
    ofstream fout("maxflow.out");
    int V, E;
    fin >> V >> E;
    vector<int> adj[nmax];
    for(int i = 1; i <= E; ++i)
    {
        int src, dst, capacity;
        fin >> src >> dst >> capacity;

        adj[src].push_back(dst);
        adj[dst].push_back(src);
        cap[src][dst] = capacity;
    }
    int flow = 0;
    int dad[nmax] = {0};
    while(BFmaxFlow(1, V, dad, adj, V)) {
        int mini = INT_MAX;
        int crt = V;
        while(crt != 1){
            mini = min(mini, cap[dad[crt]][crt] - f[dad[crt]][crt]);
            crt = dad[crt];
        }
        crt = V;
        while(crt != 1){
            f[dad[crt]][crt] += mini;
            f[crt][dad[crt]] -= mini;
            crt = dad[crt];
        }
        flow += mini;
     }

     fout << flow;
     return 0;
}