Cod sursa(job #2695889)

Utilizator denisa.iordacheIordache Denisa-Elena denisa.iordache Data 14 ianuarie 2021 19:57:18
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>

using namespace std;

const int NMAX = 1010;
const int INF = 1e9;
int N,M;
int G[NMAX][NMAX], r[NMAX][NMAX],parent[NMAX];
bool viz[NMAX];

vector<int> g[NMAX];

//functie pentru a determina daca exista un drum de la s la d in graful rezidual
bool BFS (int s,  int d)
{

    for(int i=1;i<=N;i++)
    {
        viz[i] = false;
    }

    queue<int> q;
    q.push(s);
    viz[s] = true;
    parent[s] = -1;

    while(!q.empty())
    {
        auto aux = q.front();
        q.pop();

        for(auto i: g[aux])
        {
            if(viz[i] == false && r[aux][i] >0)
            {
                if (i != d){
                    q.push(i);
                }

                viz[i] = true;
                parent[i] = aux;


            }
        }

    }

    return (viz[d] == true);
}



int main() {

    ifstream f("maxflow.in");
    ofstream out("maxflow.out");
    int src, dest, capacitate;
    f>>N>>M;
    for(int i=0;i<M;i++)
    {
        f>>src>>dest>>capacitate;
        g[src].push_back(dest);
        g[dest].push_back(src);
        r[src][dest] = capacitate;


    }



    int max_flow = 0;

    while (BFS(1,N))
    {
        for (auto i : g[N])
        {
            if (!viz[i] || !r[i][N])
                continue;
            int aux = INF;
            parent[N] = i;
            for (int node = N; node != 1; node = parent[node])
                aux = min(aux, r[parent[node]][node]);
            for (int node = N; node != 1; node = parent[node])
            {
                r[parent[node]][node] -= aux;
                r[node][parent[node]] += aux;
            }
            max_flow += aux;
        }
    }

    out<<max_flow;








}