社区讨论

32pts,Dinic求调

P3376【模板】网络最大流参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lqt9e95a
此快照首次捕获于
2023/12/31 16:58
2 年前
此快照最后确认于
2023/12/31 19:33
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=5e3+10;
const ll inf=1e15;
ll ans=0,w[maxn<<1],dep[maxn];
int n,m,s,t,u,v,val,top,cur=0;
int p[maxn<<1],h[maxn],nxt[maxn<<1],curh[maxn];
queue<int> q;
inline void add(int x,int y,int ww){
	nxt[++cur]=h[x],h[x]=cur,p[cur]=y,w[cur]=ww;
	nxt[++cur]=h[y],h[y]=cur,p[cur]=x,w[cur]=0;
}
inline ll dfs(int o,ll con){
	if(o==t) return con;
	ll res=0,minn;
	for(int i=curh[o];i&&con;i=nxt[i]){
		curh[o]=i;
		if(w[i]>0&&(dep[p[i]]==dep[o]+1)){
			minn=dfs(p[i],min(con,w[i]));
			if(!minn) dep[p[i]]=inf;
			w[i]-=minn;
			w[i^1]+=minn;
			res+=minn;
			con-=minn;
		}
	}
	return res;
}
inline bool bfs(){
	while(!q.empty()) q.pop();
	for(int i=1;i<=n;i++) dep[i]=inf;
	q.push(s),dep[s]=0,curh[s]=h[s];
	while(!q.empty()){
		top=q.front();
		q.pop();
		for(int i=h[top];i;i=nxt[i]){
			if(w[i]>0&&dep[p[i]]==inf){
				dep[p[i]]=dep[top]+1;
				curh[p[i]]=h[p[i]];
				q.push(p[i]);
				if(p[i]==t) return true;
			}
		}
	}
	return false;
}
int main(){
	cin>>n>>m>>s>>t;
	for(int i=1;i<=m;i++){
		cin>>u>>v>>val;
		add(u,v,val);
	}
	while(bfs()) ans+=dfs(s,inf);
	cout<<ans;
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...