Cod sursa(job #3155963)

Utilizator andreiiorgulescuandrei iorgulescu andreiiorgulescu Data 10 octombrie 2023 12:45:40
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.65 kb
#include <bits/stdc++.h>

using namespace std;

#define int long long

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

struct Flux
{
    vector<vector<int>>cap;
    vector<vector<int>>g;
    vector<int>t;
    vector<int>dist;
    int n;
    int inf = 1e9;

    Flux(int N)
    {
        n = N;
        g.resize(n + 1);
        t.resize(n + 1);
        dist.resize(n + 1);
        cap.resize(n + 1);
        for (int i = 1; i <= n; i++)
            cap[i].resize(n + 1);

    }

    void Baga(int x,int y,int c)
    {
        g[x].push_back(y);
        g[y].push_back(x);
        cap[x][y] = c;
    }

    bool Bfs(int s,int d)
    {
        dist.assign(n + 1,inf);
        t.assign(n + 1,0);
        queue<int>q;
        q.push(s);
        dist[s] = 0;
        while (!q.empty())
        {
            int nod = q.front();
            q.pop();
            for (auto vecin : g[nod])
            {
                if (dist[vecin] > 1 + dist[nod] and cap[nod][vecin] != 0 and vecin != d)
                {
                    dist[vecin] = 1 + dist[nod];
                    q.push(vecin);
                    t[vecin] = nod;
                }
                else if (vecin == d and cap[nod][vecin] != 0)
                    return true;
            }
        }
        return false;
    }

    int MaxFlow(int s,int d)
    {
        int ans = 0;
        int iter = 0;
        while (Bfs(s,d) == true)
        {
            /*iter++;
            if (iter <= 5)
            {
                for (int i = 1; i <= n; i++)
                    cout << t[i] << ' ';
                cout << endl;
            }*/
            for (auto vecin : g[d])
            {
                if (dist[vecin] < inf and cap[vecin][d] != 0)
                {
                    int nod = d,flux = inf;
                    t[d] = vecin;
                    while (nod != s)
                    {
                        flux = min(flux,cap[t[nod]][nod]);
                        nod = t[nod];
                    }
                    ans += flux;
                    //cout << ans << endl;
                    nod = d;
                    while (nod != s)
                    {
                        cap[t[nod]][nod] -= flux;
                        cap[nod][t[nod]] += flux;
                        nod = t[nod];
                    }
                }
            }
        }
        return ans;
    }
};

signed main()
{
    int n, m;
    in >> n >> m;
    Flux g(n);
    for(int i = 0; i < m; i++)
    {
        int x,y,c;
        in >> x >> y >> c;
        g.Baga(x,y,c);
    }
    out << g.MaxFlow(1, n);
}