Pagini recente » Cod sursa (job #2829728) | Cod sursa (job #2296683) | hc_round_9 | Cod sursa (job #1815976) | Cod sursa (job #2884865)
#include <bits/stdc++.h>
using namespace std;
typedef int ll;
const ll NMAX=1e3+5,MMAX=5e3+5;
ll cap[NMAX][NMAX],flow[NMAX][NMAX];
bool adj[NMAX][NMAX];
vector<ll> edg[NMAX];
ll layer[NMAX],ptr[NMAX];
ll s,t,n,m;
ll dfs(ll u, ll f){
if(!f || u==t) return f;
for(ll& i=ptr[u];i<edg[u].size();i++){
ll v=edg[u][i];
if(layer[v]==layer[u]+1 && flow[u][v]<cap[u][v]){
ll new_flow=dfs(v,min(f,cap[u][v]-flow[u][v]));
if(new_flow){
flow[u][v]+=new_flow;
flow[v][u]-=new_flow;
return new_flow;
}
}
}
return 0;
}
int main()
{
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
fin>>n>>m;
for(ll i=0;i<m;i++){
ll u,v,f;
fin>>u>>v>>f;
adj[u][v]=adj[v][u]=1;
cap[u][v]+=f;
//cap[v][u]-=f;
}
for(ll i=1;i<=n;i++) for(ll j=1;j<=n;j++) if(adj[i][j]) edg[i].push_back(j);
s=1,t=n;
ll ans=0;
for(;;){
for(ll i=1;i<=n;i++)
layer[i]=-1,ptr[i]=0;
layer[s]=0;
queue<ll> q;
q.push(s);
while(!q.empty()){
for(auto it : edg[q.front()]){
if(flow[q.front()][it]<cap[q.front()][it] && layer[it]==-1)
layer[it]=layer[q.front()]+1,q.push(it);
}
q.pop();
}
if(layer[t]==-1) break;
int iter=0;
for(;;){
ll new_flow=dfs(s,INT_MAX);
if(new_flow==0) break;
iter++;
ans+=new_flow;
}
if(iter==0) break;
}
fout<<ans<<'\n';
return 0;
}