Lovely_Cheese @ 2024-02-05 20:43:10
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,st,ed,ans=0;
struct node{
int to,nxt,val;
}w[5141<<1];
int h[5141<<1],cnt=1;
void Link(int x,int y,int val){
++cnt;
w[cnt].to=y;
w[cnt].nxt=h[x];
w[cnt].val=val;
h[x]=cnt;
return ;
}
queue<int> q;
int cur[5141<<1],dep[5141<<1];
bool bfs(){
for(int i=1;i<=n;i++) dep[i]=0;
dep[st]=1;
q.push(st);
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=h[x];i!=-1;i=w[i].nxt){
int y=w[i].to;
if(w[i].val){
if(!dep[y]){
q.push(y);
dep[y]=dep[x]+1;
if(y==ed) return true;
}
}
}
}
return false;
}
int dfs(int x,int flow){
if(x==ed) return flow;
int rest=flow,u;
for(int i=cur[x];i!=-1&&rest;i=w[i].nxt){
cur[x]=i;
int y=w[i].to,val=w[i].val;
if(val){
if(dep[y]==dep[x]+1){
u=dfs(y,min(rest,val));
if(!u) dep[y]=0;
w[i].val-=u;
w[i^1].val+=u;
rest-=u;
}
}
}
return flow-rest;
}
void Dinic(){
int flow=0;
while(bfs()){
for(int i=1;i<=n;i++) cur[i]=h[i];
while(flow=dfs(st,INT_MAX)) ans+=flow;
}
return ;
}
signed main(){
memset(h,-1,sizeof(h));
cin>>n>>m>>st>>ed;
for(int i=1;i<=m;i++){
int u,v,w;
cin>>u>>v>>w;
Link(u,v,w);
Link(v,u,0);
}
Dinic();
cout<<ans<<endl;
return 0;
}
by Stevehim @ 2024-02-05 20:52:07
@Lovely_Cheese 把读入优化一下就可以了
推荐使用fread快读或直接加
ios::sync_with_stdio(false),cin.tie(0), cout.tie(0);
by Lovely_Cheese @ 2024-02-05 20:59:42
@Stevehim 加了没用
by Super_Cube @ 2024-02-05 21:02:42
@Lovely_Cheese 你把 bfs
里面的 if(y==ed) return true;
删掉,然后在最后的地方改为 return dep[ed];
by Super_Cube @ 2024-02-05 21:05:29
@Lovely_Cheese 亲测过了。