Cod sursa(job #2962307)

Utilizator TeoDiDiaconescu Teodora TeoDi Data 8 ianuarie 2023 10:47:16
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>

using namespace std;

#define N 1005
#define oo 1e9

int n, m;
int cap[N][N], flow[N][N];
int tot[N];
bool viz[N];

vector <int> vec[N];
bool BFS()
{
    int Q[N], nod;
    Q[0] = Q[1] = 1;
    memset(viz, false, sizeof viz);
    viz[1] = true;

    for(int i = 1; i <= Q[0]; ++i)
    {
        nod = Q[i];
        if(nod == n) continue;

        for(int i = 0; i < vec[nod].size(); ++i)
        {
            int k = vec[nod][i];
            if(flow[nod][k] == cap[nod][k] || viz[k]) continue;
            viz[k] = true;
            Q[++Q[0]] = k;
            tot[k] = nod;
        }
    }
    return viz[n];
}

int flux()
{
    int max_flow = 0, flmin;
    while(BFS())
        for(int i = 0; i < vec[n].size(); ++i)
        {
            int nod = vec[n][i];
            if(flow[nod][n] == cap[nod][n] || viz[nod] == 0) continue;
            tot[n] = nod;

            flmin = oo;

            for(int i = n; i != 1; i = tot[i])
                flmin = min(flmin, cap[tot[i]][i] - flow[tot[i]][i]);

            for(int i = n; i != 1; i = tot[i])
                flow[tot[i]][i] += flmin,
                        flow[i][tot[i]] -= flmin;
            max_flow += flmin;
        }
    return max_flow;
}

int main()
{
    freopen("maxflow.in","rt",stdin);
    freopen("maxflow.out","wt",stdout);

    scanf("%d %d", &n, &m);

    int x, y, z;
    for(int i = 1; i <= m; ++i)
    {
        scanf("%d %d %d",&x, &y, &z);
        vec[x].push_back(y);
        vec[y].push_back(x);
        cap[x][y] = z;
    }

    printf("%d", flux());
}