Cod sursa(job #1852705)

Utilizator Alexa2001Alexa Tudose Alexa2001 Data 21 ianuarie 2017 09:48:21
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

const int Nmax = 1005;
int n, x, y, z, m, i;

class MaxFlow
{
    vector<int> v[Nmax];
    int t[Nmax], f[Nmax][Nmax], c[Nmax][Nmax];

    bool bfs()
    {
        memset(t, -1, sizeof(t));
        t[1] = 0;

        queue<int> q;
        q.push(1);

        int node;
        while(!q.empty())
        {
            node = q.front();
            q.pop();
            for(auto it : v[node])
                if(t[it] == -1 && f[node][it] < c[node][it])
                {
                    if(it==n) return 1;
                    q.push(it);
                    t[it] = node;
                }
        }

        return 0;
    }

    public :

    int max_flow()
    {
        int fmin, dad, node, ans=0;
        while(bfs())
        {
            for(auto d : v[n])
            if(t[d] != -1)
            {
                fmin = c[d][n] - f[d][n];

                node = d;
                while(node != 1)
                {
                    dad = t[node];
                    fmin = min(c[dad][node] - f[dad][node], fmin);
                    node = dad;
                }

                ans += fmin;

                f[d][n] += fmin;
                f[n][d] -= fmin;

                node = d;
                while(node != 1)
                {
                    dad = t[node];
                    f[dad][node] += fmin;
                    f[node][dad] -= fmin;
                    node = dad;
                }
            }


        }

        return ans;
    }

    void add_edge(int x, int y, int z)
    {
        c[x][y] = z;
        v[x].push_back(y);
        v[y].push_back(x);
    }

} A;

int main()
{
    fin >> n >> m;
    for(i=1; i<=m; ++i)
    {
        fin >> x >> y >> z;
        A.add_edge(x, y, z);
    }

    fout << A.max_flow() << '\n';

    return 0;
}