Cod sursa(job #2849680)

Utilizator chriss_b_001Cristian Benghe chriss_b_001 Data 15 februarie 2022 15:21:50
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>

using namespace std;

const int NMAX = 1001,
          INF = 0x3f3f3f3f;

int N, M, S, D,
    C[NMAX][NMAX],
    F[NMAX][NMAX],
    T[NMAX];

vector<int> G[NMAX];

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

void citire()
{
    int x, y;
    f >> N >> M;
    while(M--)
    {
        f >> x >> y >> C[x][y];
        G[x].push_back(y);
        G[y].push_back(x);
    }
}

bool bfs()
{
    queue <int> Q;
    for(int i = 1; i <= N; ++i)
        T[i] = 0;
    T[S] = -1;
    Q.push(S);
    while(!Q.empty())
    {
        int nod = Q.front();
        Q.pop();
        for(int &i : G[nod])
            if(T[i] == 0 && C[nod][i] > F[nod][i])
            {
                T[i] = nod;
                Q.push(i);
            }
    }
    return T[D] != 0;
}

int Edmonds_Karp()
{
    int flow = 0;
    int i, cmin;
    while(bfs())
    {
        cmin = INF;
        for(i = D; i != S; i = T[i])
            cmin = min(cmin, C[T[i]][i] - F[T[i]][i]);
        for(i = D; i != S; i = T[i])
        {
            F[T[i]][i] += cmin;
            F[i][T[i]] -= cmin;
        }
        flow+=cmin;
    }
    return flow;
}

int main()
{
    citire();
    S = 1;
    D = N;
    g << Edmonds_Karp();
    return 0;
}