Cod sursa(job #2962317)

Utilizator HAUBAUHAULICA TUDOR HAUBAU Data 8 ianuarie 2023 12:03:52
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");


vector<vector<int> > capacity,graf;
vector<int> tata;
int n,m,t,s;


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

int EdmondsKarp()
{
    long maxFlow=0;
    while(BFS()==true)
    {
        int u,v=t;
        int pathFlow=INT_MAX;
        while(v!=s)
        {
            u=tata[v];
            if(capacity[u][v]<pathFlow)
                pathFlow=capacity[u][v];
            v=tata[v];
        }
        v=t;
        while(v!=s)
        {
            u=tata[v];
            capacity[u][v]-=pathFlow;
            capacity[v][u]+=pathFlow;
            v=tata[v];
        }
        maxFlow+=pathFlow;
    }
    return maxFlow;
}


int main()
{
    int u,v,cap;
    fin>>n>>m;
    t=n;
    s=1;

    graf.resize(n+1);
    tata.resize(n+1);
    capacity.resize(n+1, vector<int>(n+1));
    for(int i=1; i<=m; i++)
    {
        fin>>u>>v>>cap;
        graf[u].push_back(v);
        graf[v].push_back(u);
        capacity[u][v]=cap;
    }
    fout << EdmondsKarp();
    return 0;
}