Cod sursa(job #2470165)

Utilizator Carol_LucaCarol Luca Carol_Luca Data 8 octombrie 2019 19:52:53
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.87 kb
#include <fstream>

#include <vector>

#include <deque>

#include <bitset>



using namespace std;



ifstream fin("maxflow.in");

ofstream fout("maxflow.out");



int n, m, i, j, t[1001], flux[1001][1001], cap[1001][1001], sol, a, b, c, tata, minim, nod;

deque<int> coada;

vector<int> v[1002];

bitset<1001> f;



bool bfs(){

    coada.push_back(1);

    f.reset();

    f[1] = 1;

    t[1] = 0;

    while(!coada.empty()){

        int p = coada[0];

        for(int i = 0;i<v[p].size();i++){

            int vecin = v[p][i];

            if(f[vecin] == 0 && cap[p][vecin] > flux[p][vecin]){

                f[vecin] = 1;

                t[vecin] = p;

                coada.push_back(vecin);

            }

        }

        coada.pop_front();

    }

    return f[n];

}



int main(){

    fin>>n>>m;

    for(i=1;i<=m;i++){

        fin>>a>>b>>c;

        v[a].push_back(b);

        v[b].push_back(a);

        cap[a][b] = c;

    }

    while(bfs()){

        for(i=0;i<v[n].size();i++){

            b = v[n][i];

            if(f[b] == 1 && cap[b][n] > flux[b][n]){

                tata = b, nod = n, minim = cap[tata][nod] - flux[tata][nod];

                while(tata){

                    minim = min(minim, cap[tata][nod] - flux[tata][nod]);

                    nod = tata;

                    tata = t[nod];

                }

                tata = b, nod = n;

                if(minim != 0){

                    while(tata){

                        flux[tata][nod] += minim;

                        flux[nod][tata] -= minim;

                        nod = tata;

                        tata = t[nod];

                    }

                }

                sol += minim;

            }

        }

    }

    fout<<sol;

    return 0;

}