Cod sursa(job #2574459)

Utilizator RazvanPanaiteRazvan Panaite RazvanPanaite Data 5 martie 2020 22:36:52
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
#include <bits/stdc++.h>
#define pb push_back

using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

void debug_out() { cerr << '\n'; }
template <typename Head, typename... Tail> void debug_out(Head H, Tail... T) { cerr << " " << H; debug_out(T...);}
#define dbg(...) cerr << #__VA_ARGS__ << " ->", debug_out(__VA_ARGS__)
#define dbg_v(x, n) do{cerr<<#x"[]: ";for(int _=0;_<n;++_)cerr<<x[_]<<" ";cerr<<'\n';}while(0)
#define dbg_ok cerr<<"OK!\n"

typedef pair<int,int> pii;
typedef long long int ll;
typedef long double ld;

const int DMAX = 1010;

vector <int> arb[DMAX];
queue <int> q;

int V[DMAX];
int tata[DMAX];
int M[DMAX][DMAX];

int n,m;
ll ans;

bool bfs();

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    int t,i,j;
    int x,y,z;
    int cap;

    fin>>n>>m;
    for(i=1;i<=m;i++){
        fin>>x>>y>>z;
        M[x][y]=z;
        arb[x].pb(y);
        arb[y].pb(x);
    }
    while(bfs()){
        for(auto& it:arb[n]){
            cap=M[it][n];
            for(i=it;i>1;i=tata[i])
                cap=min(cap,M[tata[i]][i]);
            if(cap <= 0)
                continue;
            M[it][n]-=cap;
            M[n][it]+=cap;
            for(i=it;i>1;i=tata[i]){
                M[tata[i]][i]-=cap;
                M[i][tata[i]]+=cap;
            }
            ans+=cap;
        }
    }
    fout<<ans<<'\n';
    return 0;
}
bool bfs(){
    vector <bool> uz(n+1,0);
    q.push(1);
    uz[1]=true;
    while(!q.empty()){
        int node=q.front();
        q.pop();
        for(auto& it:arb[node])
            if(!uz[it] && M[node][it] > 0){
                uz[it]=true;
                tata[it]=node;
                if(it != n)
                    q.push(it);
            }
    }
    if(uz[n])
        return true;
    return false;
}