Cod sursa(job #2421972)

Utilizator zdavid112zIon David-Gabriel zdavid112z Data 16 mai 2019 21:03:06
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <bits/stdc++.h>

using namespace std;

int n;
int c[1010][1010];

int viz[1010];
int p[1010];
vector<int> g[1010];

void bfs()
{
    queue<int> q;
    memset(viz, 0, sizeof(viz));
    memset(p, 0, sizeof(p));

    viz[1] = 1;
    p[1] = 1;
    q.push(1);
    while(!q.empty()) {
        int nod = q.front();
        q.pop();

        for(int v : g[nod]) {
            if(v != n && !viz[v] && c[nod][v] > 0) {
                viz[v] = 1;
                p[v] = nod;
                q.push(v);
            }
        }
    }
}

int main() {
    freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out", "w", stdout);
    int m;
    scanf("%d%d", &n, &m);
    for(int i = 0; i < m; i++) {
        int a, b, cost;
        scanf("%d%d%d", &a, &b, &cost);
        c[a][b] = cost;
        g[a].push_back(b);
        g[b].push_back(a);
    }

    int maxflow = 0;
    while(1) {
        bfs();
        int ok = 0;

        for(int v : g[n])
        {
            if(viz[v] && c[v][n] > 0)
            {
                ok = 1;
                int flow = c[v][n];

                int nod = v;
                while(nod != p[nod])
                {
                    flow = min(flow, c[p[nod]][nod]);
                    nod = p[nod];
                }

                c[v][n] -= flow;
                c[n][v] += flow;
                nod = v;
                while(nod != p[nod])
                {
                    c[p[nod]][nod] -= flow;
                    c[nod][p[nod]] += flow;
                    nod = p[nod];
                }
                maxflow += flow;
            }
        }
        if(!ok)
            break;
    }
    printf("%d", maxflow);
    return 0;
}