Nu aveti permisiuni pentru a descarca fisierul grader_test1.ok

Cod sursa(job #2695087)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 11 ianuarie 2021 18:47:06
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.77 kb
#include <bits/stdc++.h>

using namespace std;


struct MaxFlow {
    static const int VMAX = 1010;
    static const int inf = 1e9;

    int cap[VMAX][VMAX], tata[VMAX];
    char vaz[VMAX];
    vector<int> v[VMAX];
    queue<int> q;

    void add_edge(int x, int y, int c) {
        cap[x][y] = c;
        v[x].push_back(y);
        v[y].push_back(x);
    }

    bool bfs(int sursa, int dest) {
        memset(vaz, 0, sizeof(vaz));
        vaz[sursa] = 1;
        q.push(sursa);
        while(!q.empty()) {
            int nod = q.front();
            q.pop();
            for (int vec : v[nod]) {
                if (vaz[vec] or !cap[nod][vec]) continue;
                vaz[vec] = 1;
                tata[vec] = nod;
                if (vec != dest) q.push(vec);
            }
        }
        return vaz[dest] > 0;
    }

    int flow(int sursa, int dest) {
        int flw = 0;
        while(bfs(sursa, dest)) {
            for (int vec : v[dest]) {
                if (!vaz[vec] or !cap[vec][dest]) continue;
                int s = inf;
                tata[dest] = vec;
                for (int nod = dest; nod != sursa; nod = tata[nod]) s = min(s, cap[tata[nod]][nod]);
                for (int nod = dest; nod != sursa; nod = tata[nod]) {
                    cap[tata[nod]][nod] -= s;
                    cap[nod][tata[nod]] += s;
                }
                flw += s;
            }
        }
        return flw;
    }
} mf;

int main()
{
    freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out", "w", stdout);
    int n, m, x, y, c;
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= m; ++i) {
        scanf("%d%d%d", &x, &y, &c);
        mf.add_edge(x, y, c);
    }
    printf("%d",mf.flow(1, n));
    return 0;
}