Cod sursa(job #2380619)

Utilizator victorv88Veltan Victor victorv88 Data 15 martie 2019 12:06:47
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
using namespace std;

ifstream f("maxflow.in");
ofstream g("maxflow.out");

queue<int>q;
int n, m, rezidual[1005][1005], a, b, c, father[1005], mini, max_flow;
vector<int>graph[1005];
bitset<1005>viz;

bool parcurgere()
{
    while (!q.empty())
        q.pop();
    viz.reset();
    q.push(1);
    viz[1]=1;
    while (!q.empty())
    {
        int nod=q.front();
        q.pop();
        if (nod==n)
        {
            return 1;
        }
        for (auto &v:graph[nod])
        {
            if (!viz[v] && rezidual[nod][v])
            {
                q.push(v);
                viz[v]=1;
                father[v]=nod;
            }
        }
    }
    return 0;
}

void solve()
{
    while (parcurgere())
    {
        mini=0x3f3f3f3f;
        for (int nod=n; nod!=1; nod=father[nod])
        {
            if (rezidual[father[nod]][nod]<mini)
                mini=rezidual[father[nod]][nod];
        }
        for (int nod=n; nod!=1; nod=father[nod])
        {
            rezidual[father[nod]][nod]-=mini;
            rezidual[nod][father[nod]]+=mini;
        }
        max_flow+=mini;
    }
    cout << max_flow;
}

int main()
{
    f >> n >> m;
    for (int i=0; i<m; ++i)
    {
        f >> a >> b >> c;
        graph[a].push_back(b);
        graph[b].push_back(a);
        rezidual[a][b]=c;
    }
    solve();
    return 0;
}