Cod sursa(job #2584196)

Utilizator victorv88Veltan Victor victorv88 Data 18 martie 2020 15:36:20
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 kb
#include <bits/stdc++.h>
using namespace std;

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

queue<int>q;
int n, m, a, b, c;
int capacitate[5005][5005], flux[5005][5005], father[5005];
bool viz[5005];
vector<int>graph[5005];

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

    return 0;
}

void solve()
{
    int flux_maxim=0;
    int mini;
    while (parcurgere())
    {
        while (!q.empty())
            q.pop();
        for (auto &v:graph[n])
        {
            if (viz[v] && flux[v][n]!=capacitate[v][n])
            {
                mini=0x3f3f3f3f;
                father[n]=v;
                for (int nod=n; nod!=1; nod=father[nod])
                {
                    mini=min(mini,capacitate[father[nod]][nod]-flux[father[nod]][nod]);
                }
                flux_maxim+=mini;
                if (mini!=0)
                {
                    for (int nod=n; nod!=1; nod=father[nod])
                    {
                        flux[father[nod]][nod]+=mini;
                        flux[nod][father[nod]]-=mini;
                    }
                }
            }
        }
    }
    g << flux_maxim;
}
int main()
{
    f >> n >> m;
    for (int i=1; i<=m; ++i)
    {
        f >> a >> b >> c;
        graph[a].push_back(b);
        graph[b].push_back(a);
        capacitate[a][b]=c;
    }
    solve();
    return 0;
}