Cod sursa(job #2554019)

Utilizator CiboAndreiAndrei Cibo CiboAndrei Data 22 februarie 2020 14:56:19
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <bits/stdc++.h>

using namespace std;

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

const int dim = 1002;

int n, m;
vector <int> v[dim];

int parent[dim];
bool viz[dim];
int cap[dim][dim], flw[dim][dim];

bool bfs(int node){
    vector <int> q;

    memset(viz, 0, sizeof(viz));
    viz[node] = 1;
    q.push_back(node);

    for(int i = 0; i < q.size(); ++i){
        int prnt = q[i];
        if(prnt == n)
            continue;
        for(auto it: v[prnt]){
            if(viz[it])
                continue;
            if(flw[prnt][it] == cap[prnt][it])
                continue;

            viz[it] = 1;
            q.push_back(it);
            parent[it] = prnt;
        }
    }

    return viz[n];
}

int main(){
    int i, a, b, c;

    f >> n >> m;

    for(i = 1; i <= m; ++i){
        f >> a >> b >> c;

        v[a].push_back(b);
        v[b].push_back(a);
        cap[a][b] = c;
    }

    int flow = 0;

    while(bfs(1)){
        int flxmn = 1000000000;

        for(int nod = n; nod != 1; nod = parent[nod])
            flxmn = min(flxmn, cap[parent[nod]][nod] - flw[parent[nod]][nod]);

        if(flxmn != 0){
            for(int nod = n; nod != 1; nod = parent[nod]){
                flw[parent[nod]][nod] += flxmn;
                flw[nod][parent[nod]] -= flxmn;
            }

            flow += flxmn;
        }
    }

    g << flow;

    return 0;
}