Cod sursa(job #2947516)

Utilizator pctirziuTirziu Petre pctirziu Data 26 noiembrie 2022 11:07:16
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
const int nmax = 1005;
int flux[nmax][nmax], fluxmaxim[nmax][nmax];
vector <int> edge[nmax];
int viz[nmax], parent[nmax];
bool bfs(int n)
{
    int i;
    for(i = 1; i <= n; i++)
        viz[i] = 0;
    viz[1] = 1;
    queue <int> q;
    q.push(1);
    while(!q.empty()){
        int nod = q.front();
        q.pop();
        if(nod == n)
            continue;
        for(i = 0; i < edge[nod].size(); i++){
            int newnode = edge[nod][i];
            if(flux[nod][newnode] == fluxmaxim[nod][newnode] or viz[newnode])
                continue;
            parent[newnode] = nod;
            viz[newnode] = 1;
            q.push(newnode);
        }
    }
    return viz[n];
}
int main()
{
    int n, i, j, m;
    cin >> n >> m;
    for(i = 1; i <= m; i++){
        int x, y, z;
        cin >> x >> y >> z;
        fluxmaxim[x][y] +=  z;
        edge[x].push_back(y);
        edge[y].push_back(x);
    }
    int ans = 0;
    while(bfs(n)){
        for(i = 0; i < edge[n].size(); i++){
            int nod = edge[n][i];
            if(fluxmaxim[nod][n] == flux[nod][n] or !viz[nod])
                continue;
            parent[n] = nod;
            int min_flux = 1e9 + 5;
            for(j = n; j != 1; j = parent[j])
                min_flux = min(min_flux, fluxmaxim[parent[j]][j] - flux[parent[j]][j]);
            if(min_flux == 0)
                continue;
            for(j = n; j != 1; j = parent[j]){
                flux[parent[j]][j] += min_flux;
                flux[j][parent[j]] -= min_flux;
            }
            ans += min_flux;
        }
    }
    cout << ans;
    return 0;
}