Cod sursa(job #2588601)

Utilizator Senth30Denis-Florin Cringanu Senth30 Data 24 martie 2020 23:51:20
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.89 kb
#include <bits/stdc++.h>

using namespace std;
const int NMAX = 1010;
int N, M, flux;
int father[NMAX];
int cap[NMAX][NMAX], flow[NMAX][NMAX];
bool seen[NMAX];

vector <int> edges[NMAX];
queue <int> Q;

void read(){
    scanf("%d%d", &N, &M);
    int a, b, c;
    for(int i = 1; i <= M; i++){
        scanf("%d%d%d", &a, &b, &c);
        edges[a].push_back(b);
        edges[b].push_back(a);
        cap[a][b] = c;;
    }
}

bool bellman_ford(){
    Q.push(1);
    seen[1] = true;
    while(!Q.empty()){
        int node = Q.front();
        Q.pop();
        for(int i = 0; i < edges[node].size(); i++){
            int x = edges[node][i];
            if(!seen[x] && cap[node][x] - flow[node][x] > 0){
                Q.push(x);
                father[x] = node;
                seen[x] = true;
            }
        }
    }
    if(!father[N])
        return false;

    int node = N;
    for(int i = 0; i < edges[node].size(); i++){
        int x = edges[node][i];
        if(cap[x][N] - flow[x][N] > 0){
            int Min = cap[x][N] - flow[x][N];
            for(int j = x; j != 1; j = father[j])
                if(cap[father[j]][j] - flow[father[j]][j] < Min)
                    Min = cap[father[j]][j] - flow[father[j]][j];
            flow[x][N] += Min;
            flow[N][x] -= Min;
            for(int j = x; j != 1; j = father[j]){
                flow[father[j]][j] += Min;
                flow[j][father[j]] -= Min;
            }
            flux += Min;
        }
    }
    return true;
}

int main(){

    freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out", "w", stdout);

    read();

    bool retry = 1;
    while(retry){
        retry = false;
        for(int i = 1; i <= N; i++){
            father[i] = 0;
            seen[i] = false;
        }
        retry = bellman_ford();
    }
    printf("%d", flux);

    return 0;
}