Cod sursa(job #1967798)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 17 aprilie 2017 03:03:54
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <bits/stdc++.h>
using namespace std;

constexpr int maxn = 1e3 + 100;

ifstream f("maxflow.in");
ofstream g("maxflow.out");

vector<int> vec[maxn] = {};
int n, m, s, t, cap[maxn][maxn] = {}, flux[maxn][maxn] = {},
    tata[maxn] =  {};

bool build_tree(){
    queue<int> de_viz;
    de_viz.push(s);
    memset(tata, 0, sizeof(tata));
    while(!de_viz.empty()){
        const int cur = de_viz.front();
        de_viz.pop();
        for(const auto next : vec[cur]){
            if(tata[next] || flux[cur][next] == cap[cur][next]) continue;
            tata[next] = cur;
            if(next != t) de_viz.push(next); } }
    return tata[t]; }

int do_flux(){
    int max_flux = 0;
    while(build_tree()){
        for(const auto x : vec[t]){
            if(tata[x] == 0 || cap[x][t] == flux[x][t]) continue;
            int delta = 1e9;
            tata[t] = x;
            for(int nod = t; nod != s; nod = tata[nod])
                delta = min(delta, cap[tata[nod]][nod] - flux[tata[nod]][nod]);
            max_flux += delta;
            for(int nod = t; nod != s; nod = tata[nod])
                flux[tata[nod]][nod] += delta,
                flux[nod][tata[nod]] -= delta; } }
    return max_flux; }

int main(){
    f >> n >> m;
    s = 1, t = n;
    for(int i = 0, x, y, z; i < m; ++i){
        f >> x >> y >> z;
        cap[x][y] = z;
        vec[x].push_back(y);
        vec[y].push_back(x); }
    g << do_flux() << endl;
    return 0; }