Cod sursa(job #2960554)

Utilizator Daniel7390Popescu Daniel Daniel7390 Data 4 ianuarie 2023 17:33:33
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <iostream>
#include <fstream>
#include <climits>
#include <vector>
#include <queue>

using namespace std;

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

int N, M, s, f;
vector<int> tata;
vector<vector<int>> capacitate;
vector<vector<int>> listaAdiacenta;
bool bfs()
{
    vector<int> vizitat(N+1, 0);
    queue<int> q;
    q.push(s);
    vizitat[s] = 1;
    tata[s] = -1;
    while(!q.empty())
    {
        int u = q.front();
        q.pop();
        for(auto v: listaAdiacenta[u])
        {
            if(vizitat[v]==0 && capacitate[u][v]!=0)
            {
                tata[v] = u;
                if(v == f)
                    return true;
                vizitat[v] = 1;
                q.push(v);
            }
        }
    }
    return false;
}


int main()
{
    fin >> N >> M;
    s = 1;
    f = N;
    listaAdiacenta.resize(N+1);
    tata.resize(N+1);
    capacitate.resize(N+1, vector<int>(N+1));

    for(int i = 1; i <= M; i++)
    {
        int u, v;
        long c;
        fin >> u >> v >> c;
        listaAdiacenta[u].push_back(v);
        listaAdiacenta[v].push_back(u);
        capacitate[u][v] = c;
    }

    long max_flow = 0;

    while(bfs())
    {
        int u, v, path_flow = INT_MAX;

        for(v = f; v != s; v = tata[v])
        {
            u = tata[v];
            if(capacitate[u][v] < path_flow)
                path_flow = capacitate[u][v];
        }

        for(v = f; v != s; v = tata[v])
        {
            u = tata[v];
            capacitate[u][v] -= path_flow;
            capacitate[v][u] += path_flow;
        }

        max_flow += path_flow;
    }

    fout << max_flow;

    return 0;
}