Cod sursa(job #2711757)

Utilizator OvidRata Ovidiu Ovid Data 24 februarie 2021 17:54:17
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 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

int t, n, m, k, a[300010], q, l, r;

vector<int> g[1010];
int c[5010][5010];
int f[5010][5010];


bool v[5010];
int p[5010];

int bfs(int s, int t){

for(int i=0; i<=n; i++){
    v[i]=false;
    p[i]=0;
}
int res=0;

queue<pii> q; q.push({s, (int)1e8});
while(!q.empty()){

    int fr=(q.front()).ft, fat=(q.front().sc); q.pop();
    if(fr==t){res=fat; break; }
    v[fr]=true;
    for(int u:g[fr]){

        if(v[u]==true){continue;}

                //if( (c[e]-f[e])==0 ){continue;}
            if(c[fr][u]==f[fr ][u] ){continue;}
            p[u]=fr;
            q.push({u, min(c[fr][u]-f[fr][u], fat) } );
            v[u]=true;
    }
}
int cr=t;
while(cr!=0){
    f[p[cr] ][cr]+=res;
    f[cr ][p[cr] ]-=res;
    cr=p[cr];
}

return res;
}



int32_t main(){
INIT

freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);

cin>>n>>m;


for(int i=1; i<=m; i++){
    int u, v;
    cin>>u>>v;
    cin>>c[u][v];
    g[u].pb(v);
    g[v].pb(u);
}



int res=0;

while(true){
    int x=bfs(1, n);
    if(x==0){break;}
    //cout<<x<<flush<<"\n";
    res+=x;
}




cout<<res;

return 0;
}