Cod sursa(job #2476068)

Utilizator aZvezdaAtanas Dimitrov aZvezda Data 17 octombrie 2019 23:39:43
Problema Flux maxim Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.51 kb
#include <bits/stdc++.h>
using namespace std;
//#pragma GCC optimize ("O3")
//#pragma GCC target ("sse4")
#define endl "\n"
#define pb push_back
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const ll mod = 1e9 + 7, inf = 1e9 + 10;

struct Edge {
    ll to, cap, fl;
};

const ll MAX_N = 1e3 + 10;;

struct FlowNetwork {
    vector<ll> g[MAX_N];
    vector<Edge> edges;
    ll dist[MAX_N], ind[MAX_N], s, d;
    FlowNetwork() {}
    void addEdge(ll a, ll b, ll cap) {
        g[a].push_back(edges.size());
        edges.push_back({b, cap, 0});
        g[b].push_back(edges.size());
        edges.push_back({a, 0, 0});
    }
    void set(ll _s, ll _d) {s = _s, d = _d;}
    bool bfs() {
        for(ll i = 0; i < MAX_N; i ++) {dist[i] = MAX_N * MAX_N; ind[i] = 0;}
        queue<ll> q;
        q.push(s);
        dist[s] = 0;
        while(!q.empty()) {
            ll curr = q.front(); q.pop();
            cout << curr << " " << dist[curr] << endl;
            for(auto nxt : g[curr]) {
                Edge e = edges[nxt];
                if(dist[e.to] > dist[curr] + 1 && e.cap - e.fl > 0) {
                    q.push(e.to);
                    dist[e.to] = dist[curr] + 1;
                }
            }
        }
        return dist[d] != MAX_N * MAX_N;
    }
    ll dfs(ll curr, ll pushed) {
        if(pushed == 0 || curr == d) {
            return pushed;
        }
        for(; ind[curr] < g[curr].size();) {
            ll c = ind[curr] ++;
            Edge e = edges[g[curr][c]];
            if(dist[e.to] != dist[curr] + 1 || e.cap - e.fl <= 0) {continue;}
            ll t = dfs(e.to, min(pushed, e.cap - e.fl));
            if(t == 0) {continue;}
            edges[g[curr][c]].fl += t;
            edges[g[curr][c] ^ 1].fl -= t;
            return t;
        }
        return 0;
    }
    ll maxFlow() {
        ll f = 0;
        while(true) {
            if(!bfs()) {
                return f;
            }
            ll t = dfs(s, inf);
            f += t;
        }
    }
};

FlowNetwork fn;

int main() {
    //ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    ofstream myfile;
    myfile.open ("maxflow.out");
    ifstream myFileIn;
    myFileIn.open ("maxflow.in");
    ll n, m;
    myFileIn >> n >> m;
    for(ll i = 0; i < m; i ++) {
        ll a, b, cap;
        myFileIn >> a >> b >> cap;
        fn.addEdge(a, b, cap);
    }
    fn.set(1, n);
    myfile << fn.maxFlow() << endl;
    return 0;
}