Cod sursa(job #2747121)

Utilizator bigmixerVictor Purice bigmixer Data 28 aprilie 2021 20:41:10
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.16 kb
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#define all(a) (a).begin(), (a).end()
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#define fr first
#define sc second
//#define int long long
#define rc(s) return cout<<s,0
#define rcc(s) cout<<s,exit(0)


mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

const int nmax = 1005;

int n, m, capacity[nmax][nmax];

vector<int>nod[nmax];

bool bfs(int s, int t, vector<int>&parent, vector<pair<int,int>>&lista){
    for(int i=1;i<=n;i++){
        parent[i] = -1;
    }
    parent[s] = 0;
    queue<pair<int,int>>Q;
    Q.push({s, 1e6});
    while(Q.size()){
        auto it = Q.front();
        Q.pop();
        for(auto i : nod[it.fr]){
            if(parent[i] == -1 && capacity[it.fr][i]){
                if(i == t){
                    lista.push_back({it.fr, min(it.sc, capacity[it.fr][i])});
                }
                else{
                    parent[i] = it.fr;
                    Q.push({i, min(it.sc, capacity[it.fr][i])});
                }
            }
        }
    }
    if(lista.size()) return true;
    else return false;
}

int maxflow(int s, int t){
    int flow = 0;
    vector<int>parent(nmax);
    vector<pair<int,int>>lista;
    while(bfs(s, t, parent, lista) == true){
        for(auto x : lista){
            flow += x.sc;
            capacity[x.fr][t] -= x.sc;
            capacity[t][x.fr] += x.sc;
            int curr = x.fr;
            while(parent[curr]){
                capacity[parent[curr]][curr] -= x.sc;
                capacity[curr][parent[curr]] += x.sc;
                curr = parent[curr];
            }
        }
        lista.clear();
    }
    return flow;
}

int32_t main(){
    ios_base::sync_with_stdio(false);cin.tie(0);cerr.tie(0);cout.tie(0);
    freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out", "w", stdout);
    cin >> n >> m;
    for(int i=1;i<=m;i++){
        int x, y, z;
        cin >> x >> y >> z;
        nod[x].push_back(y);
        nod[y].push_back(x);
        capacity[x][y] = z;
    }
    cout << maxflow(1, n) << '\n';
}