Cod sursa(job #2575818)

Utilizator Fatu_SamuelFatu Samuel Fatu_Samuel Data 6 martie 2020 15:36:01
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 kb
#include <bits/stdc++.h>

using namespace std;

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

const int nmax = 1005;
const int inf = (1 << 30);

int n, m;

vector < int > l[nmax];

int ca[nmax][nmax], f[nmax][nmax], p[nmax];

int main()
{
    fin >> n >> m;

    for (int i = 1; i <= m; i++)
    {
        int x, y, c;

        fin >> x >> y >> c;

        l[x].push_back(y);
        l[y].push_back(x);

        ca[x][y] += c;
    }


    int ft = 0;

    do
    {
        for (int i = 1; i <= n; i++)
            p[i] = inf;

        queue < int > q;

        q.push(1);

        while (!q.empty())
        {
            int nod = q.front();
            q.pop();

            if (nod == n)
                continue;

            for (int el : l[nod])
            {
                if (p[el] == inf && ca[nod][el] > f[nod][el])
                {
                    p[el] = nod;
                    q.push(el);
                }
            }
        }

        if (p[n] != inf)
        {
            for (int el : l[n])
            {
                if (p[el] != inf && ca[el][n] > f[el][n])
                {
                    p[n] = el;

                    int x = n, fm = inf;

                    while (x != 1)
                    {
                        fm = min(fm, ca[p[x]][x] - f[p[x]][x]);
                        x = p[x];
                    }

                    x = n;

                    while (x != 1)
                    {
                        f[x][p[x]] -= fm;
                        f[p[x]][x] += fm;
                        x = p[x];
                    }

                    ft += fm;
                }
            }


        }
    }
    while (p[n] != inf);

    fout << ft;

    fin.close();
    fout.close();
    return 0;
}