Cod sursa(job #2697222)

Utilizator StefanaArinaStefana Arina Tabusca StefanaArina Data 17 ianuarie 2021 20:26:58
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
#include <iostream>
#include <fstream>
#include <cstdio>
#include <vector>
#include <queue>

using namespace std;

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

int fl[1002][1002];
int cap[1002][1002];

vector<vector<int>> arcs;
vector<bool> viz;
vector<int> parents;

int n;

bool bfs() {
    int current_node, next_node;

    viz.assign(n + 2, 0);
    queue<int> q;

    q.push(1);
    viz[1] = 1;

    while (q.size()) {
        current_node = q.front();
        q.pop();

        if (current_node != n)
            for (int i = 0; i < arcs[current_node].size(); ++i) {
                next_node = arcs[current_node][i];

                if (fl[current_node][next_node] != cap[current_node][next_node] && !viz[next_node]) {
                    parents[next_node] = current_node;
                    viz[next_node] = true;
                    q.push(next_node);
                }
            }
    }

    return viz[n];
}


int main() {

    int m, a, b, c, flow = 0, flowmin;
    f >> n >> m;

    arcs.resize(n + 1);
    parents.resize(n + 1, 0);

    for (int i = 0; i < m; ++i) {
        f >> a >> b >> c;
        cap[a][b] += c;
        arcs[a].push_back(b);
        arcs[b].push_back(a);
    }

    while (bfs())
        for (int j = 0; j < arcs[n].size(); ++j) {
            a = arcs[n][j];
            if (viz[a] && cap[a][n] != fl[a][n]) {
                parents[n] = a;
                flowmin = -1;

                for (int i = n; i != 1; i = parents[i])
                    if (flowmin == -1 || flowmin > cap[parents[i]][i] - fl[parents[i]][i])
                        flowmin = cap[parents[i]][i] - fl[parents[i]][i];

                if (flowmin > 0)
                    for (int i = n; i != 1; i = parents[i]) {
                        fl[parents[i]][i] += flowmin;
                        fl[i][parents[i]] -= flowmin;
                    }

                flow += flowmin;
            }
        }

    g << flow;
    return 0;
}{\rtf1}