Cod sursa(job #2207601)

Utilizator xkz01X.K.Z. xkz01 Data 26 mai 2018 02:17:50
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include<bits/stdc++.h>
using namespace std;

//ifstream f("in.txt");
//ofstream g("out.txt");

int n, m, capacitate[1001][1001], flux[1001][1001], tt[1001], i;
vector<int> a[1001];

inline int minim(int a, int b){if (a<=b) return a; else return b;}

bool bfs(){
    int poz;
    bool viz[n+1]; for (int i=1;i<=n;++i) viz[i]=false;
    deque<int> coada;
    vector<int>::iterator it;
    viz[1]=true; coada.push_back(1);

    while (!coada.empty()){
        poz=coada.front(); coada.pop_front();
        for (it=a[poz].begin();it!=a[poz].end();++it) if (!viz[*it] && capacitate[poz][*it]!=flux[poz][*it]){
            tt[*it]=poz;
            if (*it==n) return true;
            viz[*it]=true;
            coada.push_back(*it);
        }
    }

    return false;
}
int main(){
    int val, sol=0, fcrt, x, y;
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d%d", &n, &m);
    for (i=1;i<=m;i++) {
        scanf("%d%d%d", &x, &y, &val);
        a[x].push_back(y);
        a[y].push_back(x);
        capacitate[x][y]+=val;
    }
    while (bfs()){
        fcrt=999999999;
        for (i=n;i!=1;i=tt[i])
            fcrt=minim(fcrt, capacitate[tt[i]][i]-flux[tt[i]][i]);
        for (i=n;i!=1;i=tt[i]) {
            flux[tt[i]][i]+=fcrt;
            flux[i][tt[i]]-=fcrt;
        }
        sol+=fcrt;
    }
    printf("%d\n", sol);
    return 0;
}