社区讨论

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 条回复,欢迎继续交流。

正在加载回复...