Cod sursa(job #3336686)

Utilizator unomMirel Costel unom Data 25 ianuarie 2026 12:48:55
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.49 kb
//DINIC NORMAL

//SOLUTII
//DINIC NORMAL
//DINIC CU SCALING (TEORETIC MAI BUN, DAR PRACTIC PARE LFL SAU MAI PROST)
//EDMONDS KARPS BFS
//DFS CU SCALING

#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 prost[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[edge[it].dest] == 0 && prost[edge[it].dest] == 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; //TREBUIE INDEXATE DE LA 0

                return newflow;
            }
            else
            {
                prost[edge[it].dest] = 1;
            }
        }
    }

    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))
    {
        for(int i = 1; i<=n; i++)
        {
            prost[i] = 0;
        }

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

            if(newflow == 0)
            {
                break;
            }

            ans += newflow;
        }
    }

    out<<ans;

    return 0;
}