Cod sursa(job #3136882)

Utilizator vladp1324Vlad Pasare vladp1324 Data 9 iunie 2023 00:19:11
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>
#include <queue>

#define NMAX 1000
#define MMAX 5000
#define INF 2000000000

using namespace std;

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

int n, m;
int g[NMAX+1][NMAX+1];
bool viz[NMAX+1];

bool bfs(int s, int d, int parinte[]){
    for(int i = 1; i <= n; i++)
        viz[i] = false;
    queue <int> q;
    q.push(s);
    while(!q.empty()){
        int x = q.front();
        q.pop();
        for(int i = 1; i <= n; i++){
            if(g[x][i] != 0 && viz[i] == false){
                parinte[i] = x;
                viz[i] = true;
                q.push(i);
                if(i == d) return true;
            }
        }
    }
    return false;
}

int edmondsKarp(int s, int d){
    int parinte[NMAX+1];
    int flux_maxim = 0;
    while(bfs(s, d, parinte)){
        int flux_curent = INF;
        for(int u = d; u != s; u = parinte[u]){
            int v = parinte[u];
            flux_curent = min(flux_curent,g[v][u]);
        }
        for(int u = d; u != s; u = parinte[u]){
            int v = parinte[u];
            g[v][u] = g[v][u] - flux_curent;
            g[u][v] = g[u][v] + flux_curent;
        }
        flux_maxim = flux_maxim + flux_curent;
    }
    return flux_maxim;
}

int main()
{
    fin >> n >> m;
    for(int i = 1; i <= m; i++){
        int x, y, capacitate;
        fin >> x >> y >> capacitate;
        g[x][y] = capacitate;
    }
    fout << edmondsKarp(1, n);
    return 0;
}