Cod sursa(job #3041988)

Utilizator _andrei4567Stan Andrei _andrei4567 Data 3 aprilie 2023 13:45:10
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
#include <vector>
#include <queue>
#include <string.h>
#include <climits>

using namespace std;

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

const int INF = INT_MAX;
const int N = 1000;
int flux[N + 1][N + 1], tata[N + 1];
bool viz[N + 1];

vector <int> g[N + 1];

int n, m, x, y, cap;

bool bfs (int node, int fin)
{
    queue <int> q;
    memset (tata, 0, sizeof(tata));
    memset (viz, 0, sizeof (viz));
    q.push(node);
    viz[node] = 1;
    while (!q.empty())
    {
        int x = q.front();
        q.pop();
        for (auto it : g[x])
            if (!viz[it] && flux[x][it] > 0)
            {
                viz[it] = 1;
                if (it == fin)
                {
                    tata[it] = x;
                    return 1;
                }
                tata[it] = x;
                q.push(it);
            }
    }
    return 0;
}

int ff (int start, int fin)
{
    int maxflow = 0;
    while (bfs (start, fin))
    {
        int mn = INF, dad;
        for (int i = fin; i != start; i = tata[i])
            dad = tata[i], mn = min (mn, flux[dad][i]);
        for (int i = fin; i != start; i = tata[i])
        {
            dad = tata[i];
            flux[dad][i] -= mn;
            flux[i][dad] += mn;
        }
        maxflow += mn;
    }
    return maxflow;
}

int main()
{
    cin >> n >> m;
    for (int i = 1; i <= m && cin >> x >> y >> cap; ++i)
    {
        g[x].push_back(y);
        g[y].push_back(x);
        flux[x][y] = cap;
    }
    cout << ff (1, n) << '\n';
    return 0;
}