Cod sursa(job #2961013)

Utilizator TeoDiDiaconescu Teodora TeoDi Data 5 ianuarie 2023 16:05:15
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <bits/stdc++.h>

using namespace std;

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

int Dinic(vector<vector<int> > &cap, int s, int t){
    int n = cap.size();
    vector<int> d(n), ptr(n);
    int flow = 0;
    while(true){
        queue<int> q;
        q.push(s);
        fill(d.begin(), d.end(), -1);
        d[s] = 0;
        while(!q.empty()){
            int v = q.front();
            q.pop();
            for(int i = 0; i < n; i++){
                if(d[i] == -1 && cap[v][i] > 0){
                    q.push(i);
                    d[i] = d[v] + 1;
                }
            }
        }
        if(d[t] == -1)
            break;
        fill(ptr.begin(), ptr.end(), 0);
        function<int(int, int)> dfs = [&](int v, int flow){
            if(v == t)
                return flow;
            for(int &i = ptr[v]; i < n; i++){
                if(d[i] == d[v] + 1 && cap[v][i] > 0){
                    int pushed = dfs(i, min(flow, cap[v][i]));
                    if(pushed > 0){
                        cap[v][i] -= pushed;
                        cap[i][v] += pushed;
                        return pushed;
                    }
                }
            }
            return 0;
        };
        while(int pushed = dfs(s, INT_MAX))
            flow += pushed;
    }
    return flow;
}

int main()
{
    vector<vector<int>> cap;
    int n, m;
    fin >> n >> m;
    cap.resize(n);
    for (int i = 0; i < n; i++) {
        cap[i].resize(n);
    }
    for (int i = 0; i < m; i++) {
        int u, v, c;
        fin >> u >> v >> c;
        cap[u - 1][v - 1] = c;
    }
    fout << Dinic(cap, 0, n - 1) << endl;
    return 0;
}