Cod sursa(job #2642083)

Utilizator OvidRata Ovidiu Ovid Data 13 august 2020 17:13:56
Problema Flux maxim Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include<bits/stdc++.h>
using namespace std;
#define INIT  ios_base :: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define mp make_pair
#define pb push_back
#define ft first
#define sc second
#define ll long long
#define pii pair<int, int>
#define count_bits __builtin_popcount
#define int ll

ifstream fin("maxflow.in"); ofstream fout("maxflow.out");
#define cin fin
#define cout fout



int n, m;
int c[1010][1010];
int r[1010][1010];
vector<int> g[1010];
bool v[1010];
bool is_sink[1010];
int flux[1010];


int dfs(int s, int cut){
v[s]=true;
if(is_sink[s]==true ){int res=min(cut, c[s][n]-flux[s]); flux[s]+=res; return res;}
int res=0;
for(int i:g[s]){
    if( ((r[s][i]<c[s][i]) && (v[i]==false)) && (i!=n) ){
        int ret=dfs(i, min(cut, c[s][i]-r[s][i]));
        if(ret>0){
            r[s][i]+=ret; r[i][s]-=ret;
            res=ret; break;
        }
    }
}
v[s]=false;
return res;
}



int32_t main(){
INIT
cin>>n>>m;
while(m--){
    int x,y; cin>>x>>y; cin>>c[x][y];
    //c[y][x]=c[x][y];
    g[x].pb(y); g[y].pb(x);
    if(y==n){
        is_sink[x]=true;
    }
}



while(true){
    int cut=dfs(1, 1e9);
    //fin+=cut;
    if(cut<=0){break;}
}
int res=0;
for(int i=1; i<=n; i++){
    if(is_sink[i]==true){
        res+=flux[i];
    }
}
/*for(int i=1; i<=n; i++){
    for(int j=1; j<=n; j++){
        cout<<r[i][j]<<" ";
    }
    cout<<"\n";
}*/

cout<<res;



return 0;
}