Cod sursa(job #2470141)

Utilizator aZvezdaAtanas Dimitrov aZvezda Data 8 octombrie 2019 19:13:48
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.58 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 = 1e18;


const ll MAX_N = 1e3 + 10;
struct Edge {
    ll to, cap, f;
    Edge(ll to, ll cap) : to(to), cap(cap), f(0) {}
    Edge() : to(0), cap(0), f(0) {}
};

struct Dinic {
    ll s, t, n, m;
    vector<int> g[MAX_N];
    int dist[MAX_N], id[MAX_N];
    Edge edges[MAX_N * 5];
    Dinic(ll s, ll t, ll n) : s(s), t(t), n(n) {}
    void addEdge(ll a, ll b, ll cap) {
        g[a].push_back(m);
        edges[m].to = b;
        edges[m ++].cap = cap;
        g[b].push_back(m);
        edges[m ++].to = a;
    }
    bool bfs() {
        for(ll i = 0; i < n; i ++) {dist[i] = -1; id[i] = 0;}
        queue<ll> q;
        q.push(s);
        dist[s] = 0;
        while(!q.empty()) {
            ll curr = q.front(); q.pop();
            for(auto nxt : g[curr]) {
                if(dist[edges[nxt].to] != -1 || edges[nxt].cap - edges[nxt].f < 1) {continue;}
                dist[edges[nxt].to] = dist[curr] + 1;
                q.push(edges[nxt].to);
            }
        }
        return dist[t] != -1;
    }
    ll dfs(ll curr, ll pushed) {
        if(pushed == 0 || curr == t) {return pushed;}
        for(; id[curr] < g[curr].size();) {
            int nxt = g[curr][id[curr] ++];
            if(dist[edges[nxt].to] != dist[curr] + 1 || edges[nxt].cap - edges[nxt].f < 1) {continue;}
            ll tr = dfs(edges[nxt].to, min(edges[nxt].cap - edges[nxt].f, pushed));
            if(tr != 0) {
                edges[nxt].f += tr;
                edges[nxt ^ 1].f -= tr;
                return tr;
            }
        }
        return 0;
    }
    ll callDfs() {
        for(ll i = 0; i < n; i ++) {id[i] = 0;}
        return dfs(s, inf);
    }
    ll maxFlow() {
        ll ret = 0;
        while(bfs()) {
            ll p;
            while(p = callDfs()) {
                ret += p;
            }
        }
        return ret;
    }
};

Dinic dc(1, MAX_N, MAX_N);

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;
    dc.t = n;
    for(ll i = 0; i < m; i ++) {
        ll a, b, cap;
        myFileIn >> a >> b >> cap;
        dc.addEdge(a, b, cap);
    }
    myfile << dc.maxFlow();
    return 0;
}