Cod sursa(job #1930654)

Utilizator MithrilBratu Andrei Mithril Data 19 martie 2017 10:26:24
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <bits/stdc++.h>
#define NMAX 1024
#define INF 0x3f3f3f3f

using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int c[NMAX][NMAX],f[NMAX][NMAX],parent[NMAX];
vector<int> g[NMAX];
int n,m,flow,flowMin;

bool BF() {
    int i,j,nod,v;
    queue<int> Q;
    bitset<NMAX> vis;
    Q.push(1);
    vis[1]=1;

    for(;Q.size();Q.pop()) {
        int nod=Q.front();
        for(auto q:g[nod]) {
            if(c[nod][q]==f[nod][q]||vis[q]) continue;
            vis[q]=1;
            Q.push(q);
            parent[q]=nod;
            if(q==n) return 1;
        }
    }
    return 0;
}

int main()
{
    fin>>n>>m;
    for(int i=1;i<=m;i++) {
        int x,y,z;
        fin>>x>>y>>z;
        c[x][y]=z;
        g[x].push_back(y);
        g[y].push_back(x);
    }
    for(flow=0;BF();flow+=flowMin) {
        flowMin=INF;

        for(int nod=n;nod!=1;nod=parent[nod]) {
            flowMin = min(flowMin, c[parent[nod]][nod]-f[parent[nod]][nod]);
        }

        for(int nod=n;nod!=1;nod=parent[nod]) {
            f[parent[nod]][nod] += flowMin;
            f[nod][parent[nod]] -= flowMin;
        }
    }
    fout<<flow;
    return 0;
}