Cod sursa(job #2257771)

Utilizator Alex18maiAlex Enache Alex18mai Data 10 octombrie 2018 14:52:54
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2 kb
//ALEX ENACHE

#include <vector>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <unordered_map>
#include <time.h>
#include <iomanip>
#include <deque>
#include <math.h>
#include <cmath>
#include <assert.h>
#include <stack>
#include <bitset>
#include <random>
#include <chrono>

using namespace std;

//#include <iostream>

#include <fstream>
ifstream cin ("maxflow.in");ofstream cout ("maxflow.out");

int cap[1010][1010];
int flow[1010][1010];
vector <int> gr[1010];
queue <int> q;
int dad[1010];

int n , m;

int bfs(){
    q.push(1);
    for (int i=2; i<=n; i++){
        dad[i] = 0;
    }
    while (!q.empty()){
        int now = q.front();
        q.pop();
        if (now == n){
            continue;
        }
        for (auto &x : gr[now]){
            if (!dad[x] && flow[now][x] < cap[now][x]){
                dad[x] = now;
                q.push(x);
            }
        }
    }
    return dad[n];
}

int main() {

    //freopen("input", "r", stdin);freopen("output", "w", stdout);

    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin>>n>>m;

    for (int i=1; i<=m; i++){
        int a , b , c;
        cin>>a>>b>>c;
        gr[a].push_back(b);
        gr[b].push_back(a); //?

        cap[a][b] += c;
    }

    int ans = 0;
    dad[1] = 1;

    while (bfs()){
        for (auto &x : gr[n]){
            if (!dad[x] || flow[x][n] == cap[x][n]){
                continue;
            }
            int MIN = 1e9;
            int now = n;
            dad[n] = x;
            while (now != 1){
                MIN = min(MIN , cap[dad[now]][now] - flow[dad[now]][now]);
                now = dad[now];
            }
            now = n;
            while (now != 1){
                flow[dad[now]][now] += MIN;
                flow[now][dad[now]] -= MIN; //?
                now = dad[now];
            }
            ans += MIN;
        }
    }

    cout<<ans;

    return 0;
}