Cod sursa(job #2840111)

Utilizator radu.Radu Cristi radu. Data 27 ianuarie 2022 09:24:36
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>
#define INF 99999999
#define NMAX 1005
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int N, M;
int cap[NMAX][NMAX], flow[NMAX][NMAX];
int tt[NMAX];
vector<vector<int>> gr;
void read() {
    fin >> N >> M;
    gr.resize(N + 1);
    int x, y, c;
    for (int i = 0; i < M; ++i) {
        fin >> x >> y >> c;
        gr[x].push_back(y);
        gr[y].push_back(x);
        cap[x][y] = c;
    }
}
int BFS(int nod) {
    int mini = INF;
    queue<int> q;
    q.push(nod);
    tt[nod] = -1;
    while (!q.empty()) {
        nod = q.front();
        q.pop();
        for (int x : gr[nod]) {
            if (tt[x] == 0 && flow[nod][x] < cap[nod][x]) {
                q.push(x);
                tt[x] = nod;
                mini = min(mini, cap[nod][x] - flow[nod][x]);
            }
        }
    }
    if (mini == INF) {
        return 0;
    }
    return mini;
}
int main()
{
    read();
    int f = BFS(1);
    while (f) {
        for (int i = N; i >= 1; i = tt[i]) {
            if (i != 1) {
                flow[i][tt[i]] -= f;
                flow[tt[i]][i] += f;
           }
        }
        memset(tt, 0, sizeof(tt));
        f = BFS(1);
    }
    int flux = 0;
    for (int i = 1; i <= N; ++i) {
        flux += flow[i][N];
    }
    fout << flux << "\n";
    return 0;
}