Cod sursa(job #2870347)

Utilizator radu.Radu Cristi radu. Data 12 martie 2022 11:51:19
Problema Flux maxim Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <cstring>
#include <queue>
#define INF 0x3f3f3f3f
#define NMAX 1005
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int N, M;
int flow[NMAX][NMAX], cap[NMAX][NMAX];
int t[NMAX];
vector<vector<int> > gr;
int x, y, c;
void read() {
    fin >> N >> M;
    gr.resize(N + 1);
    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;
    }
}
bool BFS(int node) {
    queue<int> q;
    memset(t, 0, sizeof(t));
    q.push(node);
    while (!q.empty()) {
        node = q.front();
        q.pop();
        for (int i : gr[node]) {
            if (flow[node][i] < cap[node][i] && t[i] == 0) {
                t[i] = node;
                q.push(i);
            }
        }
    }
    if (t[N] != 0)
        return true;
    return false;
}
int main()
{
    read();
    int mini;
    while (BFS(1)) {
        for (int nod : gr[N]) {
            mini = INF;
            for (int i = nod; i > 1; i = t[i]) {
                mini = min(mini, cap[t[i]][i] - flow[t[i]][i]);
            }
            for (int i = nod; i > 1; i = t[i]) {
                flow[t[i]][i] += mini;
                flow[i][t[i]] -= mini;
            }
        }
    }
    int sum = 0;
    for (int i = 1; i <= N; ++i) {
        sum += flow[1][i];
    }
    fout << sum << "\n";
    return 0;
}