Cod sursa(job #3217014)

Utilizator BuzdiBuzdugan Rares Andrei Buzdi Data 20 martie 2024 18:39:16
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <fstream>
#include <queue>
#include <stack>
#include <vector>
#include <algorithm>
#include <iomanip>
#define ll long long

using namespace std;

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

const int NMAX = 1000;
const int INF = 1e9;

int n, m, addflow, maxflow;
vector<int> G[NMAX + 1];
int capacity[NMAX + 1][NMAX + 1];
int parent[NMAX + 1];

int GetFlow()
{
    for(int i = 1; i <= n; i++)
        parent[i] = 0;

    parent[1] = -1;
    queue<pair<int, int>> Q;
    Q.push({1, INF});
    while(!Q.empty())
    {
        int node = Q.front().first;
        int minflow = Q.front().second;
        Q.pop();

        if(node == n)
            return minflow;

        for(int nextNode : G[node])
            if(!parent[nextNode] && capacity[node][nextNode])
            {
                parent[nextNode] = node;
                int minflownext = min(minflow, capacity[node][nextNode]);
                Q.push({nextNode, minflownext});
            }
    }

    return 0;
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin >> n >> m;
    for(int i = 1; i <= m; i++)
    {
        int a, b, c;
        cin >> a >> b >> c;
        capacity[a][b] += c;
        G[a].push_back(b);
        G[b].push_back(a);
    }

    addflow = GetFlow();
    while(addflow > 0)
    {
        maxflow += addflow;
        int curent = n;
        while(curent != 1)
        {
            int previ = parent[curent];
            capacity[previ][curent] -= addflow;
            capacity[curent][previ] += addflow;
            curent = previ;
        }
        addflow = GetFlow();
    }
    cout << maxflow;

    return 0;
}