Cod sursa(job #2851854)

Utilizator PopaMihaimihai popa PopaMihai Data 19 februarie 2022 10:30:59
Problema Flux maxim Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <bits/stdc++.h>

using namespace std;

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

typedef pair <int, int> PII;

const int NMAX = 1003, INF = 1e9;

int n, m, maxf;
bool sel[NMAX];

vector < int > G[NMAX];
int flux[NMAX][NMAX];
int cap[NMAX][NMAX], T[NMAX];

int mymin(int a, int b)
{
    return (a < b ? a : b);
}

void Reset()
{
    maxf = 0;
    for(int i = 1; i <= n; ++i)
        sel[i] = T[i] = 0;
}

void DFS(int node, int D, int fluxmax = INF)
{
    sel[node] = true;
    if(node == D) {
        maxf = fluxmax;
        return;
    }

    for(auto it: G[node])
        if(!sel[it] && cap[node][it] > flux[node][it])
            T[it] = node, DFS(it, D, mymin(cap[node][it] - flux[node][it], fluxmax));

    return;
}

int maxflow(int S, int D)
{
    int ans = 0;
    while(1) {
        Reset();
        DFS(S, D);
        if(maxf != 0) {
            ans += maxf;
            int node = D;
            while(node != S) {
                flux[T[node]][node] += maxf;
                node = T[node];
            }
        }
        else break;
    }
    return ans;
}

int main()
{
    fin >> n >> m;
    int x, y, c;
    for (int i = 1; i <= m; ++i) {
        fin >> x >> y >> c;
        G[x].push_back(y);
        cap[x][y] = c;
    }

    fout << maxflow(1, n) << '\n';

    return 0;
}