Cod sursa(job #2959727)

Utilizator yo_andrei_2003Murica Andrei yo_andrei_2003 Data 2 ianuarie 2023 14:55:37
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
int n, cost[1002][1002];
vector<int> adiacenta[1002];
vector<int> parinte;
queue<int> q;
bool drum() {
    parinte=vector <int>(n+1,-1);
    parinte[1]=0;
    q.push(1);
    while(!q.empty()) {
        int z=q.front();
        q.pop();
        for (auto x: adiacenta[z]) {
            if (parinte[x]==-1 && cost[z][x]>0) {
                q.push(x);
                parinte[x]=z;
            }
        }
    }
    /*for (int i = 0; i < n; ++i) {
        cout<<parinte[i]<<" ";
    }*/
    //cout<<endl;
    return parinte[n]!=-1;
}
int main() {
    int m, a, b, c,r=0;
    cin>>n>>m;
    drum();
    for (int i = 0; i < m; ++i) {
        cin>>a>>b>>c;
        adiacenta[a].push_back(b);
        adiacenta[b].push_back(a);
        cost[a][b]=c;
    }
    while(drum()) {
        for (auto x: adiacenta[n]) {
            if (parinte[x] != -1) {
                int min = 999999999;
                for (int i = n; i != 1; i = parinte[i]) {
                    if (min > cost[parinte[i]][i]) {
                        min = cost[parinte[i]][i];
                    }
                }
                for (int i = n; i != 1; i = parinte[i]) {
                    cost[parinte[i]][i] -= min;
                    cost[i][parinte[i]] += min;
                }
                r += min;
            }
        }
    }
    cout<<r;
    return 0;
}