Cod sursa(job #2961692)

Utilizator TeoDiDiaconescu Teodora TeoDi Data 6 ianuarie 2023 21:07:10
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <bits/stdc++.h>
#define oo 1e9
int n;

using namespace std;


int Dinic(vector<vector<int>> &cap, int s, int t){
    vector<int> level(n), ptr(n);
    function<bool(int)> bfs = [&](int s){
        level.assign(n, -1);
        level[s] = 0;
        queue<int> q;
        q.push(s);
        while(!q.empty()){
            int u = q.front();
            q.pop();
            for(int v = 0; v < n; v++){
                if(level[v] == -1 && cap[u][v] > 0){
                    level[v] = level[u] + 1;
                    q.push(v);
                }
            }
        }
        return level[t] != -1;
    };
    function<int(int, int)> dfs = [&](int u, int flow){
        if(u == t) return flow;
        for(int &v = ptr[u]; v < n; v++){
            if(level[v] == level[u] + 1 && cap[u][v] > 0){
                int pushed = dfs(v, min(flow, cap[u][v]));
                if(pushed > 0){
                    cap[u][v] -= pushed;
                    cap[v][u] += pushed;
                    return pushed;
                }
            }
        }
        return 0;
    };
    int flow = 0;
    while(bfs(s)){
        ptr.assign(n, 0);
        while(int pushed = dfs(s, oo)){
            flow += pushed;
        }
    }
    return flow;
}


ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

int main() {
    int m;
    fin >> n >> m;
    vector<vector<int>> muchie(n, vector<int>(n));
    for(int i = 0; i < m; i++){
        int x, y, c;
        fin >> x >> y >> c;
        x--; y--;
        muchie[x][y] += c;
    }
    fout<<Dinic(muchie, 0, n-1);
    return 0;
}