Cod sursa(job #2962305)

Utilizator TeoDiDiaconescu Teodora TeoDi Data 8 ianuarie 2023 10:37:29
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.98 kb
#include <bits/stdc++.h>
#define oo 1e9
#define N 1005
int n, t;

using namespace std;
int level[N], ptr[N];
int cap[N][N];
int flow[N][N];

int dfs (int u, int pushed) {
    if (pushed == 0) return 0;
    if (u == t) return pushed;
    for (int &cid = ptr[u]; cid < n; cid++) {
        int v = cid;
        if (level[v] == level[u] + 1 && cap[u][v] - flow[u][v] > 0) {
            int tr = dfs(v, min(pushed, cap[u][v] - flow[u][v]));
            if (tr == 0) {
                continue;
            }
            else{
                flow[u][v] += tr;
                flow[v][u] -= tr;
                return tr;
            }
        }
    }
    return 0;
};

bool bfs(int s) {
    memset(level, -1, sizeof(level));
    queue<int> q;
    q.push(s);
    level[s] = 0;
    while (!q.empty()) {
        int u = q.front();
        q.pop();
        for (int v = 0; v < n; v++) {
            if (level[v] == -1 && cap[u][v] - flow[u][v] > 0) {
                level[v] = level[u] + 1;
                q.push(v);
            }
        }
    }
    return level[t] != -1;
};

int Dinic(int s) {
    queue<int> q;
    int f = 0;
    while (true) {
        memset(level, -1, sizeof(level));
        q.push(s);
        level[s] = 0;
        while (!q.empty()) {
            int u = q.front();
            q.pop();
            for (int v = 0; v < n; v++) {
                if (level[v] == -1 && cap[u][v] - flow[u][v] > 0) {
                    level[v] = level[u] + 1;
                    q.push(v);
                }
            }
        }
        memset(ptr, 0, sizeof(ptr));
        if(level[t] == -1) break;
        while (int pushed = dfs(s, oo)) {
            f += pushed;
        }
    }
    return f;
}

int main() {
    freopen("maxflow.in","rt",stdin);
    freopen("maxflow.out","wt",stdout);
    int m;
    scanf("%d %d",&n, &m);
    for(int i = 0; i < m; i++){
        int x, y, c;
        scanf("%d %d %d",&x, &y, &c);
        x--; y--;
        cap[x][y] += c;

    }
    t  = n-1;
    printf("%d",Dinic(0));
    return 0;
}