Cod sursa(job #3217017)

Utilizator BuzdiBuzdugan Rares Andrei Buzdi Data 20 martie 2024 18:50:11
Problema Flux maxim Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.1 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;
bool reachable;
vector<int> G[NMAX + 1];
int capacity[NMAX + 1][NMAX + 1];
int parent[NMAX + 1];

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

    parent[1] = -1;
    queue<int> Q;
    Q.push(1);
    while(!Q.empty())
    {
        int node = Q.front();
        Q.pop();

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

    return parent[n];
}

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);
    }

    reachable = BFS();
    while(reachable)
    {
        for(int endNode : G[n])
            if(capacity[endNode][n] && parent[n])
            {
                int addflow = INF;
                int cur = n;
                parent[n] = endNode;
                while(cur != 1)
                {
                    int previ = parent[cur];
                    addflow = min(addflow, capacity[previ][cur]);
                    cur = previ;
                }

                if(addflow > 0)
                {
                    maxflow += addflow;
                    cur = n;
                    while(cur != 1)
                    {
                        int previ = parent[cur];
                        capacity[previ][cur] -= addflow;
                        capacity[cur][previ] += addflow;
                        cur = previ;
                    }
                }
            }

        reachable = BFS();
    }
    cout << maxflow;

    return 0;
}