Cod sursa(job #2953593)

Utilizator PatrascuAdrian1Patrascu Adrian Octavian PatrascuAdrian1 Data 11 decembrie 2022 19:04:47
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <bits/stdc++.h>

using namespace std;

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

const int Nmax = 1e3 + 5;
int G[Nmax][Nmax];
int T[Nmax];
bool seen[Nmax];
int N, M, MaxFlow;

bool BFS()
{
    queue<int> Q;
    Q.push(1);
    memset(seen,0,sizeof(seen));
    seen[1] = 1;

    while(!Q.empty())
    {
        int u = Q.front();
        if(u == N)
            break;
        Q.pop();
        for(int i = 1; i <= N; ++i)
            if(!seen[i] && G[u][i] > 0)
            {
                T[i] = u;
                seen[i] = 1;
                Q.push(i);
            }
    }
    return seen[N];
}

int main()
{
    in >> N >> M;
    while(M--)
    {
        int from, to, capacity;
        in >> from >> to >> capacity;
        G[from][to] = capacity;
    }

    while(BFS())
    {
        for(int i = 1; i <= N; ++i)
        {
            if(!G[i][N] || !seen[i])
                continue;

            T[N] = i;

            int flowPath = INT_MAX;
            for(int v = N; v != 1; v = T[v]) flowPath = min(flowPath, G[T[v]][v]);

            if(!flowPath)
                continue;

            for(int v = N; v != 1; v = T[v])
            {
                int u = T[v];
                G[u][v] -= flowPath;
                G[v][u] += flowPath;
            }

            MaxFlow += flowPath;
        }
    }
    out << MaxFlow;
    return 0;
}