Cod sursa(job #1970845)

Utilizator ZenusTudor Costin Razvan Zenus Data 19 aprilie 2017 17:29:01
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.28 kb
#include <bits/stdc++.h>

using namespace std;

const int nmax = 1009;
const int oo = 1000000000;

int n , m , i;

class network
{
    public :

    int ok[nmax] , from[nmax];
    int F[nmax][nmax] , C[nmax][nmax];
    int MaxFlow , S , D;
    queue < int > iq;
    vector < int > graph[nmax];

    int path()
    {
        memset(ok , 0 , sizeof(ok));
        memset(from , 0 , sizeof(from));
        while (iq.size()) iq.pop();

        ok[S] = 1;
        iq.push(S);

        while (iq.size())
        {
            int act = iq.front();
            iq.pop();
            if (act == D) continue;

            for (int i = 0 ; i < graph[act].size() ; ++i)
            {
                int fo = graph[act][i];
                if (ok[fo]) continue;

                if (F[act][fo] < C[act][fo])
                {
                    from[fo] = act;
                    ok[fo] = 1;
                    iq.push(fo);
                }
            }
        }
        return ok[D];
    }

    void setSource(int x)
    {
        S = x;
    }

    void setDestination(int x)
    {
        D = x;
    }

    void addEdge(int x , int y , int z)
    {
        C[x][y] = z;
        graph[x].push_back(y);
        graph[y].push_back(x);
    }

    void process()
    {
        MaxFlow = 0;
        while (path())
        for (int i = 0 ; i < graph[D].size() ; ++i)
        {
            int preD = graph[D][i];
            if (from[preD]) from[D] = preD;
            else continue;

            int Fact = oo;

            for (int i = D ; i != S ; i = from[i])
            Fact = min(Fact , C[from[i]][i] - F[from[i]][i]);

            for (int i = D ; i != S ; i = from[i])
            {
                F[from[i]][i] += Fact;
                F[i][from[i]] -= Fact;
            }

            MaxFlow += Fact;
        }
    }
} Solver;

int main()
{

freopen("maxflow.in" , "r" , stdin);
freopen("maxflow.out" , "w" , stdout);

scanf("%d" , &n);
scanf("%d" , &m);

Solver.setSource(1);
Solver.setDestination(n);

for (i = 1 ; i <= m ; ++i)
{
    int x , y , z;
    scanf("%d" , &x);
    scanf("%d" , &y);
    scanf("%d" , &z);
    Solver.addEdge(x , y , z);
}

Solver.process();

printf("%d\n" , Solver.MaxFlow);

return 0;
}