Cod sursa(job #2541616)

Utilizator iliaaaaaaaaaaaaaailia petrov iliaaaaaaaaaaaaaa Data 8 februarie 2020 17:30:10
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.24 kb
#include <iostream>
#include <cstring>
#include <queue>
#include <fstream>

const int MAXN = 128;

int n, m;

int adj[MAXN][MAXN], cadj[MAXN][MAXN];
bool used[MAXN];

int bfs(int s, int t)
{
    std::queue<int> k;
    k.push(s);
    used[s] = true;
    int p[MAXN] = {0}, cap[MAXN], ans = 0;
    for(int i = 0; i < MAXN; ++ i)
    {
        cap[i] = 1e6;
    }
    while(!k.empty())
    {
        int curr = k.front();
        k.pop();

        if(curr == t)
        {
            ans = cap[curr];
            //std::cout << ans << '\n';
            while(p[curr])
            {
                adj[p[curr]][curr] -= ans;
                adj[curr][p[curr]] += ans;
                curr = p[curr];
            }
            return ans;
        }

        for(int i = 1; i <= n; ++ i)
        {
            if(adj[curr][i] && !used[i])
            {
                //std::cout << curr << ' ' << i << '\n';
                cap[i] = std::min(std::min(cap[curr], adj[curr][i]), cap[i]);
                //std::cout << cap[i] << '\n';
                p[i] = curr;
                k.push(i);
                used[i] = true;
            }
        }
    }

    return 0;
}

int calc(int s, int t)
{
    int ans = 0, capans = bfs(s, t);
    memset(used, 0, sizeof(used));
    while(capans != 0)
    {
        //std::cout << "a\n";
        memset(used, 0, sizeof(used));
        ans += capans;
        capans = bfs(s, t);
    }

    return ans;
}

int main()
{
    #define cout myfileOut
    std::ofstream myfileOut;
    myfileOut.open ("maxflow.out");

    #define cin myFileIn
    std::ifstream myFileIn;
    myFileIn.open ("maxflow.in");

    int s, t;
    cin >> n >> m >> s >> t;

    for(int i = 0; i < m; ++ i)
    {
        int u, v, c;
        cin >> u >> v >> c;
        adj[u][v] = c;
    }

    int min = 1e6;

    /*for(int i = 2; i <= n; ++ i)
    {
        for(int i = 0; i < MAXN; ++ i)
        {
            for(int j = 0; j < MAXN; ++ j)
            {
                adj[i][j] = cadj[i][j];
            }
        }
        //int a = calc(1, i);
        //std::cout << a << '\n';
        //min = std::min(a, min);
    }*/

    cout << calc(s, t) << '\n';

    return 0;
}