Cod sursa(job #1839169)

Utilizator cojocarugabiReality cojocarugabi Data 2 ianuarie 2017 15:57:45
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.08 kb
# include <stdio.h>
# include <bits/stdc++.h>
using namespace std;
const pair < int , int > DD[] = {{1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1}};
# define fi cin
# define fo cout
# define x first
# define y second
# define ll long long
# define IOS ios_base :: sync_with_stdio(0);cin.tie(0)
# define p(v) cerr << #v << " = " << v << '\n'
# define p2(v) cerr << #v << " = " << (complex < int > (v.x,v.y)) << '\n'
# define vi vector < int >
# define vl vector < ll >
# define pii pair < int , int >
# define mp make_pair
# define db long double
# define pb push_back
# define pdd pair < db , db >
# define CF
int main(void)
{
    #ifdef CF
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    #endif // CF
    srand(time(0));
    fo << fixed << setprecision(7);
    cerr << fixed << setprecision(7);
    static int F[1 << 20];
    int n,m;
    static vector < pii > s[1 << 20];
    IOS;
    fi>>n>>m;
    for (int i = 0;i < m;++i)
    {
        int a,b,c;
        fi>>a>>b>>c;
        F[i << 1] = c;
        F[i << 1 | 1] = 0;
        s[a].pb(mp(b,i << 1));
        s[b].pb(mp(a,i << 1 | 1));
    }
    int flow = 0;
    auto bfs = [&](void)
    {
        static int D[1 << 20];
        static int E[1 << 20];
        for (int i = 1;i <= n;++i)
            D[i] = 0,E[i] = 0;
        queue < int > Q;
        Q.push(1);
        D[1] = 1;
        while (!Q.empty() && !D[n])
        {
            int node = Q.front();
            Q.pop();
            for (auto it : s[node])
                if (F[it.y] > 0 && !D[it.x])
                    D[it.x] = node,E[it.x] = it.y,Q.push(it.x);
        }
        int mn = 1e9;
        for (int i = n;i > 1;i = D[i])
            mn = min(mn,F[E[i]]);
        if (mn == 1e9 || !mn)
            return 0;
        flow += mn;
        for (int i = n;i != 1;i = D[i])
            F[E[i]] -= mn,F[E[i] ^ 1] += mn;
        return 1;
    };
    while (bfs()) ;
    fo << flow << '\n';
    cerr << "Time elapsed :" << clock() * 1000.0 / CLOCKS_PER_SEC << " ms" << '\n';
    return 0;
}