Cod sursa(job #2960706)

Utilizator Andoss1710Balanica Andrei Andoss1710 Data 4 ianuarie 2023 20:54:34
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.28 kb
#include <iostream>
#include <fstream>
#include <bits/stdc++.h>

using namespace std;

int n, m;
int cap[1001][1001];
int viz[1001], tata[1001];
vector<vector<int>> lista(1001);


ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

int bfs(){
    queue<int> coada;
    coada.push(1);
    for(int i = 1; i <= n; i++){
        tata[i] = 0;
        viz[i] = 0;
}
    viz[1]++;

    while(coada.size()!=0){
        int nod_cur = coada.front();
        if(nod_cur == n)
            return 1;
        for(int i = 0; i < lista[nod_cur].size(); i++){
            int nod_vec = lista[nod_cur][i];
            if(cap[nod_cur][nod_vec] > 0 && viz[nod_vec] == 0){
                viz[nod_vec]++;
                tata[nod_vec] = nod_cur;
                coada.push(nod_vec);

            }
        }
        coada.pop();
    }
    return 0;
}

int Edmond_Karp(){
    int max_flux = 0;
    while(bfs()){

        for(int i = 0; i < lista[n].size(); i++){
            int nod_cur = lista[n][i];
            if(cap[nod_cur][n] > 0 && viz[nod_cur]){

               vector<int> drum;
               drum.push_back(nod_cur);

               while(tata[nod_cur]!=0){
                nod_cur = tata[nod_cur];
                drum.push_back(nod_cur);
               }
                int minim = 9999999;

               for(int i = 0; i < drum.size(); i++)
                    if(i == 0)
                        minim = min(minim, cap[drum[i]][n]);
                    else
                         minim = min(minim, cap[drum[i]][drum[i-1]]);

                max_flux += minim;
                for(int i = 0; i < drum.size(); i++){
                    if(i == 0){
                        cap[drum[i]][n] -= minim;
                        cap[n][drum[i]] +=minim;
                    }
                    else{
                        cap[drum[i]][drum[i-1]] -= minim;
                        cap[drum[i-1]][drum[i]] += minim;
                    }

                }
            }
        }
    }
    return max_flux;

}

int main()
{
    fin>>n>>m;

    for(int i = 0; i < m; i++){
        int x, y, z;
        fin>>x>>y>>z;
        lista[x].push_back(y);
        lista[y].push_back(x);
        cap[x][y] = z;
    }

    fout<<Edmond_Karp();
}