Cod sursa(job #2979732)

Utilizator IoanMihaiIoan Mihai IoanMihai Data 15 februarie 2023 20:03:57
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
#define INF 0x3f3f3f3f
const int NMAX = 1005;
const int MMAX = 5005;
int tt[NMAX], c[NMAX][NMAX], f[NMAX][NMAX], cd[NMAX];
int viz[NMAX];
vector<int> G[NMAX];
int n, m, x, y, z, flow, fminn;
int bfs()
{
    cd[0] = 1;
    cd[1] = 1;
    memset(viz, 0, sizeof(viz));
    viz[1] = 1;
    for (int i=1;i<=cd[0];i++) {
        int nod = cd[i];
        if (nod == n)
            continue;
        for (int j=0;j<G[nod].size();j++){
            int vec = G[nod][j];
            if (c[nod][vec] == f[nod][vec] || viz[vec]) continue;
            viz[vec] = 1;
            cd[++ cd[0]] = vec;
            tt[vec] = nod;
        }
    }
    return viz[n];
}
int main() 
{
    fin >> n >> m;
    for (int i=1;i<=m;i++){
        fin >> x >> y >> z;
        c[x][y] += z;
        G[x].push_back(y);
        G[y].push_back(x);
    }

    while (bfs()) {
        for (int i=0;i<G[n].size();i++){
            int nod = G[n][i];
            if (f[nod][n] == c[nod][n] || !viz[nod]) continue;
            tt[n] = nod;

            fminn = INF;
            for (nod=n;nod!=1;nod=tt[nod]){
                fminn = min(fminn, c[tt[nod]][nod] - f[tt[nod]][nod]);
            }
            if (fminn == 0) continue;
            for (nod=n;nod!=1;nod=tt[nod]){
                f[tt[nod]][nod] += fminn;
                f[nod][tt[nod]] -= fminn;
            }
            flow += fminn;
        }
    }

    fout << flow << '\n';
    return 0;
}