Cod sursa(job #2906467)

Utilizator moltComan Calin molt Data 26 mai 2022 09:31:48
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.9 kb
#include <bits/stdc++.h>

using namespace std;

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

#define NMAX 1005

int n, m;

long long flow[NMAX][NMAX];
long long cap[NMAX][NMAX];
vector<int> graph[NMAX];
vector<int> path;

long long min_val;

void bfs(int src, int dest) {
    path.clear();
    queue<int> q;
    q.push(src);
    vector<bool> vis(NMAX, false);
    vis[src] = true;
    min_val = LLONG_MAX;

    while (!q.empty()) {
        int node = q.front();
        q.pop();

        path.push_back(node);
        if (path.size() > 1) {
            int prev_node = path[path.size() - 2];
            if (cap[prev_node][node] - flow[prev_node][node] < min_val && 
                        cap[prev_node][node] - flow[prev_node][node] != 0) {
                min_val = cap[prev_node][node] - flow[prev_node][node];
            }
        }

        if (node == dest) {
            return;
        }

        for (int i = 0; i < graph[node].size(); ++i) {
            int neigh = graph[node][i];
            if (!vis[neigh] && flow[node][neigh] < cap[node][neigh]) {
                vis[neigh] = true;
                q.push(neigh);
            }
        }
    }
}

int main()
{
    in >> n >> m;
    for (int i = 0; i < m; ++i) {
        int x, y;
        in >> x >> y;
        graph[x].push_back(y);
        in >> cap[x][y];
    }
    long long max_flow = 0;
    while (true) {
        bfs(1, n);
        // cout << min_val << "\n";
        // for (int i = 0; i < path.size(); ++i) {
        //     cout << path[i] << " ";
        // }
        // cout << "\n";
        if (path[path.size() - 1] != n) {
            break;
        }
        for (int i = 1; i < path.size(); ++i) {
            int prev_node = path[i - 1], curr_node = path[i];
            flow[prev_node][curr_node] += min_val;
            flow[curr_node][prev_node] -= min_val;       
        }
        max_flow += min_val;
    }

    out << max_flow;

    return 0;
}