Cod sursa(job #2816237)

Utilizator NeacsuMihaiNeacsu Mihai NeacsuMihai Data 11 decembrie 2021 10:54:01
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.44 kb
#include <cstdio>
#include <cctype>
#include <algorithm>
#include <vector>
#include <queue>

#define BUF_SIZE 1 << 17

#define NMAX 1000

using namespace std;


FILE *fin = fopen("maxflow.in", "r");
FILE *fout = fopen("maxflow.out", "w");

char buf[BUF_SIZE];
int pos = BUF_SIZE;

inline char nextch(){
    if(pos == BUF_SIZE){
        fread(buf, BUF_SIZE, 1, fin);
        pos = 0;
    }

    return buf[pos++];
}

inline int read(){
    char ch = nextch();

    while( !isdigit(ch) ){
        ch = nextch();
    }

    int nr = 0;
    while( isdigit(ch) ){
        nr = nr * 10 + ch - '0';
        ch = nextch();
    }

    return nr;
}


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()
{
    N = read();
    M = read();

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

        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];

            if(t[it] != -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;
                }
            }
        }
    }

    fprintf(fout, "%d\n", flux_total);
}