Cod sursa(job #2820863)

Utilizator DordeDorde Matei Dorde Data 21 decembrie 2021 19:28:29
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.8 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int const N = 1001 , inf = (1 << 30);
int n , m , maxflow , niv[N] , viz[N] , t[N];
map<pair<int , int> , int> ind;
struct Node{
    int to , w , f;
    Node(){
        to = w = f;
    }
    Node(int a , int b , int c){
        to = a , w = b , f = c ;
    }
};
vector<Node> v[N];
int build(){
    queue<int> q;
    q.push(1);
    for(int i = 2 ; i <= n ; ++ i)
        viz[i] = 0;
    viz[1] = 1;
    while(!q.empty()){
        int node = q.front();
        q.pop();
        for(auto y : v[node])
            if(!viz[y.to] && y.w - y.f > 0){
                viz[y.to] = 1;
                niv[y.to] = 1 + niv[node];
                q.push(y.to);
            }
    }
    return viz[n];
}
bool ok;
int dfs(int node , int flow){
    if(node == n){
        ok = true;
        return flow;
    }
    for(auto &y : v[node]){
        if(niv[y.to] == 1 + niv[node] && y.w - y.f > 0){
            int now = min(flow , y.w - y.f);
            int nf = dfs(y.to , now);
            y.f += nf;
            v[y.to][ind[make_pair(y.to , node)]].f -= nf;
            if(nf)
                return nf;
        }
    }
    return 0;
}
int main(){
    fin >> n >> m;
    for(int i = 1 ; i <= m ; ++ i){
        int a , b , c;
        fin >> a >> b >> c;
        v[a].push_back(Node(b , c , 0));
        ind[make_pair(a , b)] = v[a].size() - 1;
        v[b].push_back(Node(a , c , c));
        ind[make_pair(b , a)] = v[b].size() - 1;
    }
    while(build()){
        ok = false;
        int flow = dfs(1 , inf);
        while(ok){
            ok = false;
            maxflow += flow;
            flow = dfs(1 , inf);
        }
    }
    fout << maxflow << '\n';
    return 0;
}