Cod sursa(job #2977500)

Utilizator LuciBBadea Lucian LuciB Data 11 februarie 2023 18:18:37
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <bits/stdc++.h>
using namespace std;

const int NMAX = 1000;

vector<int> graph[NMAX + 1];
int cap[NMAX + 1][NMAX + 1];
int parent[NMAX + 1];
int s, d;

queue<int> q;
void bfs() {
    while(!q.empty())
        q.pop();
    q.push(s);
    while(!q.empty()) {
        int x = q.front();
        q.pop();
        if(x == d)
            return;
        for(auto neighbour : graph[x]) {
            if(!parent[neighbour] && cap[x][neighbour]) {
                parent[neighbour] = x;
                q.push(neighbour);
            }
        }
    }
}

int main() {
    ifstream fin("maxflow.in");
    ofstream fout("maxflow.out");
    int n, m, a, b, c, node, flux, minflux;
    fin >> n >> m;
    for(int i = 0; i < m; i++) {
        fin >> a >> b >> c;
        cap[a][b] = c;
        graph[a].push_back(b);
        graph[b].push_back(a);
    }
    s = 1, d = n;
    parent[s] = -1;
    bfs();
    flux = 0;
    while(parent[d]) {
        minflux = 1e9;
        for(node = d; node != s; node = parent[node]) {
            minflux = min(minflux, cap[parent[node]][node]);
        }
        for(node = d; node != s; node = parent[node]) {
            cap[parent[node]][node] -= minflux;
            cap[node][parent[node]] += minflux;
        }
        flux += minflux;
        for(int i = 1; i <= n; i++)
            parent[i] = 0;
        parent[s] = -1;
        bfs();
    }
    fout << flux;
    return 0;
}