Cod sursa(job #2554013)

Utilizator CiboAndreiAndrei Cibo CiboAndrei Data 22 februarie 2020 14:51:59
Problema Flux maxim Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 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));
    q.push_back(node);

    for(int i = 0; i < q.size(); ++i){
        int prnt = q[i];

        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)){
        for(auto it: v[n]){
            if(cap[it][n] == flw[it][n] || !viz[it])
                continue;
            parent[n] = it;

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