Cod sursa(job #2695325)

Utilizator vladboss2323Ciorica Vlad vladboss2323 Data 12 ianuarie 2021 14:51:49
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.82 kb
#include <bits/stdc++.h>

using namespace std;

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

struct MaxFlow {
    static const int N = 1010;
    static const int oo = 1e9;

    int cap[N][N], parent[N];
    bool viz[N];
    vector<int> v[N];
    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(viz, false, sizeof(viz));
        viz[sursa] = true;
        q.push(sursa);
        while(!q.empty()) {
            int node = q.front();
            q.pop();
            for (int vec : v[node]) {
                if (viz[vec] or !cap[node][vec]) continue;
                viz[vec] = true;
                parent[vec] = node;
                if (vec != dest) q.push(vec);
            }
        }
        return viz[dest] > 0;
    }

    int Ford_Furkerson(int sursa, int dest) {
        int max_flow = 0;
        while(bfs(sursa, dest)) {
            for (int vec : v[dest]) {
                if (!viz[vec] or !cap[vec][dest])
                    continue;
                int s = oo;
                parent[dest] = vec;
                for (int node = dest; node != sursa; node = parent[node])
                    s = min(s, cap[parent[node]][node]);
                for (int node = dest; node != sursa; node = parent[node]) {
                    cap[parent[node]][node] -= s;
                    cap[node][parent[node]] += s;
                }
                max_flow += s;
            }
        }
        return max_flow;
    }
} G;

int main()
{
    int n, m, x, y, c;
    in >> n >> m;
    for (int i = 1; i <= m; ++i) {
        in >> x >> y >> c;
        G.add_edge(x, y, c);
    }
    out << G.Ford_Furkerson(1, n);
    return 0;
}