Cod sursa(job #2960231)

Utilizator bogdaniliBogdan Iliescu bogdanili Data 3 ianuarie 2023 19:44:05
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <bits/stdc++.h>
#define inf 1e9
/// algoritmul lui Edmond karp
/// Complexitate timp : O (n*m^2)

using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int n, m;
int cap[1001][1001], res[1001][1001];
bool viz[1001];
int vecini[1001];
vector<int> graf[1001];


bool bfs()
{
    memset(viz, false, sizeof(viz));
    queue<int> q;
    q.push(1);

    while(!q.empty())
    {
        int nod = q.front();
        q.pop();

        if(nod == n) continue;

        for(int vecin : graf[nod])
        {
            if(viz[vecin] || cap[nod][vecin] == res[nod][vecin]) continue;
            viz[vecin] = true;
            vecini[vecin] = nod;
            q.push(vecin);
        }
    }

    return viz[n];
}


int main()
{
    f>>n>>m;
    int x, y;
    for(int i = 0; i < m; ++i)
    {
        f>>x>>y;
        f>>cap[x][y];
        graf[x].push_back(y);
        graf[y].push_back(x);
    }

    int flow_maxim = 0;
    while(bfs())
    {
        for(int vecin : graf[n])
        {
            if(!viz[vecin] || cap[vecin][n] == res[vecin][n]) continue;

            int flow = inf;
            vecini[n] = vecin;

            for(int nod = n; nod != 1; nod = vecini[nod])
                flow = min(flow, cap[vecini[nod]][nod] - res[vecini[nod]][nod]);

            if(!flow)
                continue;

            for(int nod = n; nod != 1; nod = vecini[nod])
            {
                res[vecini[nod]][nod] += flow;
                res[nod][vecini[nod]] -= flow;
            }

            flow_maxim += flow;
        }
    }
    g<<flow_maxim;


    return 0;
}