Cod sursa(job #2983190)

Utilizator SabailaCalinSabaila Calin SabailaCalin Data 21 februarie 2023 19:44:50
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef pair<int,ll> pil;
const int maxN = 1005;
const ll INF = 0x3f3f3f3f3f3f3f3f;

ifstream f ("maxflow.in");
ofstream g ("maxflow.out");

int N, M, p[maxN];
ll cap[maxN][maxN];
vector<int> G[maxN];

ll bfs(int s = 1, int t = N){
    fill(p+1, p+N+1, -1);
    p[s] = -2;

    queue<pil> Q;
    Q.push({s, INF});
    while(!Q.empty()){
        int u = Q.front().first;
        ll f = Q.front().second;
        Q.pop();

        for(int v : G[u]){
            if(p[v] == -1 && cap[u][v]){
                p[v] = u;
                ll aug = min(f, cap[u][v]);
                if(v == t)  return aug;
                Q.push({v, aug});
            }
        }
    }

    return 0;
}

ll maxflow(int s = 1, int t = N){
    ll flow = 0, aug = 0;
    while(aug = bfs()){
        flow += aug;
        int u = t;
        while(u != s){
            int v = p[u];
            cap[v][u] -= aug;
            cap[u][v] += aug;
            u = v;
        }
    }
    return flow;
}

int main(){
    f >> N >> M;
    for(int i = 0, a, b; i < M; i++){
        ll c;
        f >> a >> b >> c;
        G[a].push_back(b);
        G[b].push_back(a);
        cap[a][b] += c;
    }
    g << maxflow();
}