Cod sursa(job #2694699)

Utilizator raluca1234Tudor Raluca raluca1234 Data 10 ianuarie 2021 15:22:24
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.08 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>

using namespace std;

const int MAX_N = 1e3;
const int INF = 0x3f3f3f3f;

int n, m;

vector<int> adj[MAX_N];

int cap[MAX_N][MAX_N];
int flow[MAX_N][MAX_N];

bool visited[MAX_N];
int parent[MAX_N];

bool bfs() 
{
    queue<int> q;
    q.push(1);

    memset(visited, false, sizeof visited);
    visited[1] = true;

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

        if (current_node == n) {
            continue;
        }

        for (auto& neigh : adj[current_node]) {
            if (cap[current_node][neigh] == flow[current_node][neigh] || 
                visited[neigh]) {
                continue;
            }

            visited[neigh] = true;
            q.push(neigh);
            parent[neigh] = current_node;
        }
    }

    return visited[n];
}

int edmonds_karp() {
    int max_flow = 0;
    while (bfs()) {
        for (auto& node : adj[n]) {
            
            if (flow[node][n] == cap[node][n] || !visited[node]) {
                continue;
            }

            parent[n] = node;

            int current_flow = INF;
            for (int crt_node = n; crt_node != 1; crt_node = parent[crt_node]) {
                current_flow = min(current_flow, 
                    cap[parent[crt_node]][crt_node] - flow[parent[crt_node]][crt_node]);
            }

            if (current_flow == 0) {
                continue;
            }

            for (int crt_node = n; crt_node != 1; crt_node = parent[crt_node]) {
                flow[parent[crt_node]][crt_node] += current_flow;
                flow[crt_node][parent[crt_node]] -= current_flow;
            }

            max_flow += current_flow;
        }
    }
    return max_flow;
}

int main()
{
    ifstream cin("maxflow.in");
    ofstream cout("maxflow.out");
    
    cin >> n >> m;

    for (int i = 0; i < m; i++)
    {
        int x, y, z;
        cin >> x >> y >> z;
        adj[x].push_back(y);
        adj[y].push_back(x);
        cap[x][y] += z;
    }

    cout << edmonds_karp();

    return 0;
}