Cod sursa(job #2878575)

Utilizator toma_ariciuAriciu Toma toma_ariciu Data 27 martie 2022 12:23:10
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.38 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

const string filename = "maxflow";
ifstream fin(filename + ".in");
ofstream fout(filename + ".out");

const int maxN = 1005, inf = 0x3f3f3f3f;
int n, m, dist[maxN], sursa, dest, drum[maxN], max_flux;
bool viz[maxN];
struct muchie {
    int nxt, cap;
};
vector <muchie> lm;
vector <int> G[maxN];

void get_dist()
{
    for(int i = 1; i <= n; i++)
    {
        dist[i] = inf;
        viz[i] = 0;
        drum[i] = -1;
    }
    dist[dest] = 1;
    queue <int> q2;
    q2.push(dest);
    while(!q2.empty())
    {
        int nod = q2.front();
        q2.pop();
        for(int ind : G[nod])
        {
            int vecin = lm[ind].nxt;
            if(lm[ind ^ 1].cap && dist[vecin] == inf)
            {
                dist[vecin] = dist[nod] + 1;
                q2.push(vecin);
            }
        }
    }
}

bool bfs()
{
    get_dist();
    if(dist[sursa] == inf)
        return 0;
    queue <int> q;
    q.push(sursa);
    viz[sursa] = 1;
    while(!q.empty())
    {
        int nod = q.front();
        q.pop();
        if(nod == dest)
            return 1;
        for(int ind : G[nod])
        {
            int vecin = lm[ind].nxt;
            if(dist[vecin] != dist[nod] - 1)
                continue;
            if(!viz[vecin] && lm[ind].cap)
            {
                drum[vecin] = ind;
                viz[vecin] = 1;
                q.push(vecin);
            }
        }
    }
    return 0;
}

int main()
{
    fin >> n >> m;
    sursa = 1, dest = n;
    for(int i = 1; i <= m; i++)
    {
        int x, y, cap;
        fin >> x >> y >> cap;
        G[x].push_back(lm.size());
        lm.push_back({y, cap});
        G[y].push_back(lm.size());
        lm.push_back({x, 0});
    }
    while(bfs())
    {
        int min_flux = inf, arc = drum[dest];
        while(arc != -1)
        {
            int nod = lm[arc ^ 1].nxt;
            min_flux = min(min_flux, lm[arc].cap);
            arc = drum[nod];

        }
        arc = drum[dest];
        while(arc != -1)
        {
            int nod = lm[arc ^ 1].nxt;
            lm[arc].cap -= min_flux;
            lm[arc ^ 1].cap += min_flux;
            arc = drum[nod];
        }
        max_flux += min_flux;
    }
    fout << max_flux;
    return 0;
}