Cod sursa(job #1501527)

Utilizator geniucosOncescu Costin geniucos Data 13 octombrie 2015 16:47:01
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.68 kb
#include<cstdio>
#include<queue>
#include<vector>

using namespace std;

int N;

class flow_network
{
public:
    int N, M, S, D;
    int X[10009], Y[10009], C[10009], F[10009], t[10009];
    vector < int > v[10009];

    void add_edge (int a, int b, int cap)
    {
        X[++M] = a, Y[M] = b, C[M] = cap, v[a].push_back (M);
        X[++M] = b, Y[M] = a, C[M] = 0, v[b].push_back (M);
    }

    int opus (int edge)
    {
        if (edge & 1) return edge + 1;
        return edge - 1;
    }

    bool bfs ()
    {
        queue < int > cc;
        for (int i=1; i<=N; i++)
            t[i] = -1;
        cc.push (S), t[S] = 0;
        while (!cc.empty ())
        {
            int nod = cc.front ();
            cc.pop ();
            for (vector < int > :: iterator it = v[nod].begin (); it != v[nod].end (); it ++)
                if (F[*it] < C[*it] && t[Y[*it]] == -1)
                {
                    t[Y[*it]] = *it;
                    if (Y[*it] == D) return 1;
                    cc.push (Y[*it]);
                }
        }
        return 0;
    }

    int Max_Flow ()
    {
        int sol = 0;
        while (bfs ())
        {
            for (vector < int > :: iterator it = v[D].begin (); it != v[D].end (); it ++)
                if (F[opus (*it)] < C[opus (*it)] && t[Y[*it]] != -1)
                {
                    int mini = 500009;
                    t[D] = opus (*it);
                    for (int i=D; i != S; i = X[t[i]])
                        if (C[t[i]] - F[t[i]] < mini)
                            mini = C[t[i]] - F[t[i]];
                    sol += mini;
                    for (int i=D; i != S; i = X[t[i]])
                        F[t[i]] += mini, F[opus (t[i])] -= mini;
                }
        }
        return sol;
    }

    void Clear ()
    {
        for (int i=1; i<=M; i++)
            v[i].clear (), X[i] = Y[i] = C[i] = F[i] = 0;
        for (int i=1; i<=N; i++)
            t[i] = 0;
        M = N = S = D = 0;
    }
}net;

void Check ()
{
    int N, M;
    scanf ("%d %d", &N, &M), net.N = N, net.S = 1, net.D = N;
    while (M --)
    {
        int x, y, c;
        scanf ("%d %d %d", &x, &y, &c);
        net.add_edge (x, y, c);
    }
    net.Clear ();
    freopen ("maxflow.in", "r", stdin);
    freopen ("maxflow.out", "w", stdout);
    scanf ("%d %d", &N, &M), net.N = N, net.S = 1, net.D = N;
    while (M --)
    {
        int x, y, c;
        scanf ("%d %d %d", &x, &y, &c);
        net.add_edge (x, y, c);
    }
    printf ("%d\n", net.Max_Flow ());
}

int main ()
{
freopen ("maxflow.in", "r", stdin);
freopen ("maxflow.out", "w", stdout);
Check ();
return 0;
}