Cod sursa(job #2244946)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 24 septembrie 2018 12:54:52
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>
#define pii pair<int,int>
#define Nmax 1005
using namespace std;

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

int n,m,a,b,c,S = 1,D,ans;
int uz[Nmax],viz[Nmax];
vector<pii> E;
vector<int> H,v[Nmax],G[Nmax];

bool bfs(){
    for (int i=1;i<=n;i++) G[i].clear();
    memset(uz,0,sizeof(uz));
    H.clear();
    H.push_back(S); uz[S] = 1;
    for (int i=0;i<H.size();i++){
        if (H[i]==D) return 1;
        for (auto it : v[H[i]]){
            int nxt = E[it].first;
            if (!E[it].second) continue;
            if (!uz[nxt]){
                uz[nxt] = uz[H[i]]+1;
                H.push_back(nxt);
            }
            if (uz[nxt]==uz[H[i]]+1) G[H[i]].push_back(it);
        }
    }
    return 0;
}

int dfs(int nod,int flow){
    int crtF = 0;
    viz[nod] = 1;
    if (nod==D || !flow){
        viz[nod] = 0;
        return flow;
    }
    for (auto it : G[nod]){
        int nxt = E[it].first;
        if (viz[nxt]) continue;
        int aux = dfs(nxt, min(flow-crtF,E[it].second));
        crtF += aux;
        E[it].second   -= aux;
        E[it^1].second += aux;
    }
    viz[nod] = 0;
    return crtF;
}

int main()
{
    ios::sync_with_stdio(false);
    f >> n >> m;
    D = n;
    for (int i=1;i<=m;i++){
        f >> a >> b >> c;
        E.push_back({b,c});
        v[a].push_back(E.size() - 1);
        E.push_back({a,0});
        v[b].push_back(E.size() - 1);
    }

    while (bfs()) ans += dfs(S,1e9);
    g << ans;

    return 0;
}