Cod sursa(job #2154868)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 7 martie 2018 13:08:33
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>
#include <cstdio>
#include <queue>
#include <cstring>
#define Nmax 1002
#define pii pair<int,int>
#define inf 1e9
using namespace std;

FILE *f = fopen("maxflow.in","r");
ofstream g("maxflow.out");

int n,m,x,y,c,S = 1,D,mn[Nmax],viz[Nmax];
vector<pii> E;
vector<int> G[Nmax],G2[Nmax];
queue<int> Q;

bool bfs(){
    memset(mn,0,sizeof(mn));
    for (int i=1;i<=n;i++) G2[i].clear();
    while (!Q.empty()) Q.pop();
    Q.push(S);
    mn[S] = 1;
    while (!Q.empty()){
        if (Q.front()==D) return 1;
        for (auto it : G[Q.front()]){
            if (!E[it].second) continue;
            if (!mn[E[it].first]){
                Q.push(E[it].first);
                mn[E[it].first] = mn[Q.front()]+1;
            }
            if (mn[E[it].first]==mn[Q.front()]+1){
                G2[Q.front()].push_back(it);
            }
        }
        Q.pop();
    }
    return 0;
}

int dfs(int nod,int cap){
    int now = 0;
    if (nod==D || !cap) return cap;

    for (auto it : G2[nod]){
        if (viz[E[it].first]) continue;
        int flow = dfs(E[it].first, min(cap-now,E[it].second));
        E[it].second -= flow;
        E[it^1].second += flow;
        now += flow;
    }
    return now;
}

int main()
{
    fscanf(f,"%d%d",&n,&m);
    D = n;

    for (int i=1;i<=m;i++){
        fscanf(f,"%d%d%d",&x,&y,&c);
        G[x].push_back(E.size());
        E.push_back({y,c});
        G[y].push_back(E.size());
        E.push_back({x,0});
    }

    int ans = 0;
    while (bfs()){
        ans += dfs(S,inf);
    }

    g<<ans;

    return 0;
}