Cod sursa(job #3271909)

Utilizator NeacsuMihaiNeacsu Mihai NeacsuMihai Data 27 ianuarie 2025 19:25:49
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>

#define NMAX 1000

using namespace std;

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

int N, M;
bool sel[NMAX + 1];
int t[NMAX + 1];
int c[NMAX + 1][NMAX + 1];
int f[NMAX + 1][NMAX + 1];
vector <int> G[NMAX + 1];

int BFS(int u, int v){
    queue <int> Q;

    for(int i = 1; i <= N; i++){
        sel[i] = 0;
        t[i] = -1;
    }

    Q.push(u);
    sel[u] = 1;
    t[u] = 0;

    while( !Q.empty() ){
        int node = Q.front();
        Q.pop();

        for(auto it : G[node]){
            if( !sel[it] && f[node][it] < c[node][it] ){

                Q.push(it);
                sel[it] = 1;
                t[it] = node;
            }
        }
    }

    return sel[v];
}

int main()
{
    fin >> N >> M;

    for(int i = 1; i <= M; i++){
        int u, v;
        fin >> u >> v;
        fin >> c[u][v];

        G[u].push_back(v);
        G[v].push_back(u);
    }

    int flux_total = 0;
    while( BFS(1, N) ){

        int node = t[N];
        int flux_curent = c[node][N] - f[node][N];
        while(node != 1){
            int tata = t[node];

            flux_curent = min(flux_curent, c[tata][node] - f[tata][node]);

            node = tata;
        }

        flux_total += flux_curent;

        node = t[N];
        f[node][N] += flux_curent;
        f[N][node] -= flux_curent; //graful rezidual
        while(node != 1){
            int tata = t[node];

            f[tata][node] += flux_curent;
            f[node][tata] -= flux_curent; //graful rezidual

            node = tata;
        }

    }

    fout << flux_total << "\n";
}