Cod sursa(job #3336670)

Utilizator unomMirel Costel unom Data 25 ianuarie 2026 12:18:57
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.24 kb
#include <fstream>
#include <queue>
#include <vector>
#include <iostream>

using namespace std;

struct muc
{
    int cap, flow, dest;
};

ifstream in("maxflow.in");
ofstream out("maxflow.out");
int n, m;
vector<int> v[1005];
muc edge[10005];
int dist[1005];
int viz[1005];
int INF = (1 << 30);
//1 e sursa, n e destinatie

int bfs(int start)
{
    for(int i = 1; i<=n; i++)
    {
        dist[i] = INF;
    }
    queue<int> q;
    q.push(start);
    dist[start] = 0;

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

        for(auto it: v[nod])
        {
            if(edge[it].cap - edge[it].flow >= 1 && dist[edge[it].dest] == INF)
            {
                dist[edge[it].dest] = dist[nod] + 1;
                q.push(edge[it].dest);
            }
        }
    }

    return dist[n] != INF;
}

int dfs(int nod, int flow)
{
    viz[nod] = 1;

    if(nod == n)
    {
        return flow;
    }

    for(auto it: v[nod])
    {
        if(dist[edge[it].dest] == dist[nod] + 1 && edge[it].cap - edge[it].flow >= 1 && viz[it] == 0)
        {
            int newflow = dfs(edge[it].dest, min(flow, edge[it].cap - edge[it].flow));

            if(newflow >= 1)
            {
                edge[it].flow += newflow;
                edge[it ^ 1].flow -= newflow;

                return newflow;
            }
        }
    }

    return 0;
}

int main()
{
    in>>n>>m;

    int x, y, z;
    for(int i = 0; i<m; i++)
    {
        in>>x>>y>>z;

        edge[2 * i] = {z, 0, y};
        edge[2 * i + 1] = {0, 0, x};

        //bag indicele muchiei
        v[x].push_back(2*i);
        v[y].push_back(2*i + 1);
    }

    int ans = 0;
    while(bfs(1))
    {
        int ok = 1;
        int cnt = 0;
        while(ok == 1)
        {
            for(int i = 1; i<=n; i++)
            {
                viz[i] = 0;
            }
            int newflow = dfs(1, INF);

//            cout<<newflow<<" ";

            if(newflow == 0)
            {
                break;
            }

            cnt++;
            ans += newflow;
        }

        if(cnt == 0)
        {
            break;
        }
    }

    out<<ans;

    return 0;
}