社区讨论
70分求解谢谢大佬
P3376【模板】网络最大流参与者 8已保存回复 13
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 13 条
- 当前快照
- 1 份
- 快照标识符
- @mi86m8dx
- 此快照首次捕获于
- 2025/11/21 09:28 4 个月前
- 此快照最后确认于
- 2025/11/21 09:55 4 个月前
第3,4,5个点没过
刚学网络流不知道哪里有问题谢谢大佬
CPP#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
int x,y,tot,z,n,m,s,t,maxflow,dep[1000010];
const int inf=9999999;
struct node{
int to,v,next;
}edge[1000050];
int head[1000050];
queue<int>q;
void add(int x,int y,int z){
edge[++tot].to=y;
edge[tot].v=z;
edge[tot].next=head[x];
head[x]=tot;
}
int bfs(){
while(!q.empty()) q.pop();
memset(dep,0,sizeof(dep));
dep[s]=1;
q.push(s);
do{
int u=q.front();
q.pop();
for(int i=head[u];i;i=edge[i].next){
if(edge[i].v&&dep[edge[i].to]==0){
dep[edge[i].to]=dep[u]+1;
q.push(edge[i].to);
}
}
}while(!q.empty());
if(dep[t]!=0) return 1;
else return 0;
}
int dfs(int u,int dis){
if(u==t) return dis;
for(int i=head[u];i;i=edge[i].next){
if((dep[edge[i].to]==dep[u]+1)&&(edge[i].v!=0)){
int di=dfs(edge[i].to,min(dis,edge[i].v));
if(di>0){
edge[i].v-=di;
edge[i^1].v+=di;
return di;
}
}
}
return 0;
}
int dinic(){
int ans=0;
while(bfs()){
while(int ti=dfs(s,inf))
ans+=ti;
}
return ans;
}
int main(){
scanf("%d%d%d%d",&n,&m,&s,&t);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,0);
}
printf("%d\n",dinic());
}
回复
共 13 条回复,欢迎继续交流。
正在加载回复...