Cod sursa(job #2811422)

Utilizator Cosmin2004_InfoMoldoveanu Cosmin Cosmin2004_Info Data 2 decembrie 2021 11:29:25
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int NMAX = 1000;
int G[NMAX + 5][NMAX + 5], p[NMAX + 5];
vector <int> g[NMAX + 5];
bool vis[NMAX + 5];
int n, s, d;
inline bool bfs() {
    queue <int> q; q.push(s); vis[s] = true;
    while(!q.empty()) {
        int top = q.front(); q.pop();
        for(int adj : g[top])
            if(!vis[adj] && G[top][adj]) {
                p[adj] = top;
                vis[adj] = true;
                q.push(adj);
            }
    }
    return vis[d];
}

void solve() {
    for(int adj : g[d]) {
        int minf = G[adj][d];
        if(!minf) continue;
        for(int node = adj; p[node]; node = p[node])
            minf = min(minf, G[p[node]][node]);
        G[adj][d] -= minf;
        G[d][adj] += minf;
        for(int node = adj; p[node]; node = p[node]) {
            G[p[node]][node] -= minf;
            G[node][p[node]] += minf;
        }
    }
}

int main()
{
    int n, m, u, v, w;
    fin >> n >> m;
    s = 1, d = n;
    for(int i = 1; i <= m; i++) {
        fin >> u >> v >> w;
        G[u][v] = w;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    while(bfs()) {
        solve();
        memset(vis, 0, sizeof(vis));
        memset(p, 0, sizeof(p));
    }
    int sol = 0;
    for(int adj : g[s])
        sol += G[adj][s];
    fout << sol;
    return 0;
}