Cod sursa(job #2960764)

Utilizator GhiuzanuEdward Ghiuzan Ghiuzanu Data 4 ianuarie 2023 22:13:25
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <iostream>
#include <fstream>
#include <climits>
#include <vector>
#include <queue>

using namespace std;

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

int n, m, a, b, c, flux[1001][1001], viz[1001], t[1001], tot;
vector<vector<int>> ad;

bool bfs(){
    queue<int> q;
    q.push(1);
    for (int i = 0; i < n + 1; ++i) {
        t[i] = 0;
    }
    for (int i = 0; i < n + 1; ++i) {
        viz[i] = 0;
    }
    viz[1] = 1;

    while(!q.empty()){
        int x = q.front();
        q.pop();
        for (int i = 0; i < ad[x].size(); ++i) {
            int el = ad[x][i];
            if (el == 0 && flux[x][el] > 0){
                t[el] = x;
                q.push(el);
                viz[el] = 1;
                if (el == n)
                    return 1;
            }
        }
    }
    return 0;
}

int main() {
    fin>>n>>m;
    ad.resize(n + 1);
    for (int i = 0; i < m; ++i) {
        fin>>a>>b>>c;
        ad[a].push_back(b);
        ad[b].push_back(a);
        flux[a][b] = c;
    }

    while (bfs()){
        for (int i = 0; i < ad[n].size(); ++i) {
            if (viz[ad[n][i]]){
                int minn = INT_MAX;
                int x = n;
                while(x != 1){
                    minn = min(minn, flux[t[x]][x]);
                    x = t[x];
                }
                x = n;
                while(x != 1){
                    flux[t[x]][x] = flux[t[x]][x] - minn;
                    flux[x][t[x]] = flux[x][t[x]] + minn;
                    x = t[x];
                }
                tot = tot + minn;
            }
        }
    }
    fout<<tot;
    return 0;
}