Cod sursa(job #3229792)

Utilizator not_anduAndu Scheusan not_andu Data 17 mai 2024 15:48:29
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>

using namespace std;

#define INFILE "maxflow.in"
#define OUTFILE "maxflow.out"

const int N_MAX = 1e3 + 5;
const int INF = 1e9;

int n, m;
bool visited[N_MAX];
vector<int> adj[N_MAX];
int parent[N_MAX], capacity[N_MAX][N_MAX];

bool bfs(){

    memset(visited, 0, sizeof visited);

    queue<int> q;
    q.push(1);
    visited[1] = true;

    while(!q.empty()){
        int node = q.front();
        q.pop();
        if(node != n){
            for(auto &to : adj[node]){
                if(!visited[to] && capacity[node][to]){
                    parent[to] = node;
                    q.push(to);
                    visited[to] = true;
                }
            }
        }
    }

    return visited[n];

}

void solve(){

    cin >> n >> m;
    for(int i = 0; i < m; ++i){
        int node1, node2, cost;
        cin >> node1 >> node2 >> cost;
        adj[node1].push_back(node2);
        adj[node2].push_back(node1);
        capacity[node1][node2] = cost;
    }

    int ans = 0;

    while(bfs()){
        for(auto &to : adj[n]){
            if(visited[to] && capacity[to][n]){
                parent[n] = to;
                int aux = INF;
                for(int i = n; i != 1; i = parent[i]){
                    aux = min(aux, capacity[parent[i]][i]);
                }
                for(int i = n; i != 1; i = parent[i]){
                    capacity[parent[i]][i] -= aux;
                    capacity[i][parent[i]] += aux;
                }
                ans += aux;
            }
        }
    }

    cout << ans << '\n';

}

int main(){
    ios_base::sync_with_stdio(false);
    // freopen(INFILE, "r", stdin);
    // freopen(OUTFILE, "w", stdout);
    cin.tie(0), cout.tie(0);
    solve();
    return 0;
}