Cod sursa(job #2698478)

Utilizator DordeDorde Matei Dorde Data 22 ianuarie 2021 11:36:29
Problema Flux maxim Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.48 kb
#include <fstream>
#include <queue>
#include <algorithm>
#include <bitset>
using namespace std;
int const N = 1e3 + 3, M = 5e3 + 3;
int v [2 * N] ,  vf [2 * N] , nxt [2 * N] , sz , C [2 * N] , RV [2 * N];
ifstream f ("maxflow.in");
ofstream g ("maxflow.out");
int t [N] , index [N][N] , indexR [N][N];
bool viz [N];
void add (int a , int b , int c){
    vf [++ sz] = b;
    if (c)
        C [sz] = c;
    else
        RV [sz] = 0;
    nxt [sz] = v [a];
    v [a] = sz;
}
int maxflow (int n , int m){
    int r = 0;
    queue <int> q;
    bool p = true;
    while (p){
        q . push (1);
        viz [1] = true;
        p = false;
        int flow = 0;
        while (q . size () && ! p){
            int x = q . front ();
            for(int i = v [x] ; i && ! p ; i = nxt [i]){
                int y = vf [i];
                if (! viz [y] && y == n && C [i]){
                    p = true;
                    t [n] = x;
                }
                if (! viz [y] && C [i]){
                    q . push (y);
                    viz [y] = true;
                    t [y] = x;
                }
                if (! viz [y] && RV [i]){
                    q . push (y);
                    viz [y] = true;
                    t [y] = x;
                }
            }
            q . pop ();
        }
        while (q . size ())
            q . pop ();
        if (p == false)
            return r;
        int node = n;
        while (t [node]){
            int curr;
            if (index [t [node]][node])
                curr = C [index [t [node]][node]];
            else
                curr = RV [indexR [t [node]][node]];
            if (node == n)
                flow = curr;
            else
                flow = min (flow , curr);
            node = t [node];
        }
        r += flow;
        node = n;
        while (t [node]){
            int a = index [t [node]][node];
            int b = indexR [node][t [node]];
            C [a] -= flow;
            RV [b] += flow;
            node = t [node];
        }
        for(int i = 1 ; i <= n ; ++ i)
            viz [i] = false;
        fill (t + 1 , t + 1 + n , 0);
    }
}
int main()
{
    int n , m;
    f >> n >> m;
    for(int i = 1 ; i <= m ; ++ i){
        int a , b , c;
        f >> a >> b >> c;
        add (a , b , c);
        index [a][b] = sz;
        add (b , a , 0);
        indexR [b][a] = sz;

    }
    g << maxflow (n , m);
    return 0;
}