Cod sursa(job #3271906)

Utilizator NeacsuMihaiNeacsu Mihai NeacsuMihai Data 27 ianuarie 2025 19:23:22
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.06 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) ){
        //for(auto it : G[N]){
            int node = t[N];
            //cout << "it = " << it << "\n";
            //cout << "node = " << node << "\n";

            if(node != -1){
                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;
                }
            }
        //}
        //cout << "\n!\n";
    }

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