Cod sursa(job #2961324)

Utilizator DirtuEcaterinaDirtu Ecaterina DirtuEcaterina Data 6 ianuarie 2023 10:44:10
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.09 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");

vector<int>tata,viz;
vector<vector<int> > capacitate,capacitate_drum;
int n,m,t,s;

bool BFS()
{
    vector<int> viz(n+1);
    queue<int> q;
    q.push(s);
    viz[s] = 1;
    tata[s] = -1;
    while(!q.empty())
    {
        int u = q.front();
        q.pop();
        for(auto v:capacitate_drum[u])
        {
            if(viz[v]==0 && capacitate[u][v]!=0)
            {
                tata[v] = u;
                if(v == t)
                    return true;
                viz[v] = 1;
                q.push(v);
            }
        }
    }
    return false;
}

int EdmondsKarp()
{
    long capacitate_max=0;
    while(BFS()==true) //cat exista un lant nevizitat
    {
        int u,v=t;
        int capacitate_lant=999999;
        //parcurgem de doua ori lantul de la nodul final la cel de start
        //odata pentru a cauta capacitatea minima
        //apoi pentru a actualiza capacitatile muchiilor din lant pentru eventuale fluxuri viitoare
        while(v!=s)
        {
            u=tata[v];
            if(capacitate[u][v]<capacitate_lant)
                capacitate_lant=capacitate[u][v];
            v=tata[v];
        }
        v=t;
        while(v!=s)
        {
            u=tata[v];
            capacitate[u][v]-=capacitate_lant; // capacitatea muchiei din graful initial scade
            capacitate[v][u]+=capacitate_lant; // capacitatea muchiei inverse creste
            v=tata[v];
        }
        capacitate_max+=capacitate_lant;
    }
    return capacitate_max;
}
int main()
{
    int u,v,z;
    f>>n>>m;
    s=1; t=n; 
    tata.resize(n+1);
    capacitate.resize(n+1, vector<int>(n+1));
    capacitate_drum.resize(n+1);
    for(int i=1; i<=m; i++)
    {
        // muchie de la u la v cu capacitatea z
        f>>u>>v>>z;
        capacitate_drum[u].push_back(v);
        capacitate_drum[v].push_back(u);
        capacitate[u][v]=z;
    }
    g << EdmondsKarp();
    return 0;
}