Cod sursa(job #2427430)

Utilizator GashparzPredescu Eduard-Alexandru Gashparz Data 31 mai 2019 20:30:09
Problema Flux maxim Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>
#include <vector>
#include <iostream>
using namespace std;
 
int mat[20005][20005];
int viz[20005];
int minCut[20005];
int n, m;
 
int dfs(int node, int sink, int flux, int ind)
{
    if (node == sink)return flux; //daca a ajuns la final
 
    viz[node] = ind;
    int i;
    for (i = 1; i <= n; i++)
        if (viz[i] != ind && mat[node][i] > 0) //daca nu a mai fost vizitat in parcurgea actuala
        {
            if (mat[node][i] < flux)flux = mat[node][i]; //alege capacitatea minima (bottleneck)
 
            int dfsFlux = dfs(i, sink, flux, ind);  //urmatorul nod
 
            if (dfsFlux > 0)  //dupa ce a parcurs tot drumul modifica matricea cu capacitatile noi
            {
                mat[node][i] -= dfsFlux;
                //mat[i][node] += dfsFlux;
                return dfsFlux;
            }
 
        }
 
    return 0;
}
 
int main()
{
    int i, x, y, c;
    ifstream f("maxflow.in");
    ofstream g("maxflow.out");
    f >> n >> m;
    for (i = 0; i < m; i++)
    {
        f >> x >> y >> c;
        mat[x][y] = c;
                            //matrice adiacenta
    }
   
    int indexViz = 1; //fiecare drum are un index
    int maxFlux = 0;
    int flux = 0;
    for (;;)
    {
        flux = dfs(1, n, 200005, indexViz); //fluxul unui drum
 
        indexViz++;
 
        maxFlux += flux;    //se adauga la fluxul maxim
       
        if (flux == 0) { // daca nu s a mai gasit niciun drum
            break;
        }
    }
 
    g << maxFlux;
    cout << maxFlux;
    return 0;
 
 
}