Cod sursa(job #2388209)

Utilizator Constantin.Dragancea Constantin Constantin. Data 25 martie 2019 19:24:43
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.89 kb
#include <bits/stdc++.h>
using namespace std;

#define N 1005
int n, m, p[N];
long long maxflow;
struct edge{
    int from, to, c;
} M[10*N];
vector <int> v[N];
queue <int> Q;
bool viz[N];

inline int T(int q){
    return (q > m ? q - m : q + m);
}

bool bfs(){
    for (int i=1; i<=n; i++) viz[i] = 0;
    viz[1] = 1; Q.push(1);
    while (!Q.empty()){
        int nod = Q.front();
        Q.pop();
        if (nod == n) continue;
        for (auto it: v[nod]){
            if (viz[M[it].to] || !M[it].c) continue;
            p[M[it].to] = it; Q.push(M[it].to);
            viz[M[it].to] = 1;
        }
    }
    return viz[n];
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    ifstream cin ("mincut.in");
    ofstream cout ("mincut.out");
    cin >> n >> m;
    for (int i=1, x, y, z; i<=m; i++){
        cin >> x >> y >> z;
        M[i] = {x, y, z};
        M[i+m] = {y, x, 0};
        v[x].push_back(i);
        v[y].push_back(m+i);
    }
    while (bfs()){
        for (auto it: v[n]){
            if (!viz[M[it].to] || !M[T(it)].c) continue;
            p[n] = T(it);
            int flow = 1e9;
            for (int nod = n; nod != 1; nod = M[p[nod]].from)
                flow = min(flow, M[p[nod]].c);
            for (int nod = n; nod != 1; nod = M[p[nod]].from){
                M[p[nod]].c -= flow;
                M[T(p[nod])].c += flow;
            }
            maxflow += flow;
        }
    }
    for (int i=1; i<=n; i++) viz[i] = 0;
    cout << maxflow << '\n';
    /*
    Q.push(1); viz[1] = 1;
    while (!Q.empty()){
        int nod = Q.front();
        Q.pop();
        for (auto it: v[nod]){
            if (it > m || viz[M[it].to]) continue;
            if (!M[it].c) cout << M[it].from << " " << M[it].to << '\n';
            else Q.push(M[it].to), viz[M[it].to] = 1;
        }
    }
    */
    return 0;
}