社区讨论

求助dinic过不了样例2

P4722【模板】最大流 加强版 / 预流推进参与者 2已保存回复 2

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@m0hhqmhe
此快照首次捕获于
2024/08/31 09:55
2 年前
此快照最后确认于
2025/11/04 21:58
4 个月前
查看原帖
rt
样例
CPP
10 16 1 2
1 3 2
1 4 2
5 2 2
6 2 2
3 5 1
3 6 1
4 5 1
4 6 1
1 7 2147483647
9 2 2147483647
7 8 2147483647
10 9 2147483647
8 5 2
8 6 2
3 10 2
4 10 2

代码
CPP
#include <bits/stdc++.h>
#define min(a,b) a<b?a:b
using namespace std;
typedef long long ll;
const int MAXN=2e6;
const ll inf=1e15;
int cnt,S,T,n,m,head[MAXN],to[MAXN],nxt[MAXN],dep[MAXN];
ll cap[MAXN];
namespace flow {
	void add(int x,int y,ll w) {
		to[++cnt]=y,cap[cnt]=w;
		nxt[cnt]=head[x],head[x]=cnt;
	}
	void add_edge(int x,int y,ll w) {
		add(x,y,w);
		add(y,x,0);
	}
	void init() {
		for(int i=1; i<=cnt; i++) head[i]=0;
		cnt=1;
	}
	bool bfs() {
		queue<int> q;
		for(int i=S; i<=T+1; i++) dep[i]=-1;
		q.push(S),dep[S]=0;
		while(!q.empty()) {
			int x=q.front();
			q.pop();
			for(int i=head[x]; i; i=nxt[i]) {
				int y=to[i];
				if(dep[y]!=-1||cap[i]==0) continue;
				dep[y]=dep[x]+1;
				q.push(y);
			}
		}
		return (dep[T]!=-1);
	}
	ll dfs(int x,ll lim) {
		if(x==T) return lim;
		if(lim==0) return 0;
		ll ans=0;
		for(int i=head[x]; i; i=nxt[i]) {
			int y=to[i];
			if(dep[x]+1!=dep[y]||cap[i]==0) continue;
			ll Min=dfs(y,min(lim,cap[i]));
			cap[i]-=Min,lim-=Min;
			cap[1^i]+=Min,ans+=Min;
			if(lim==0) break;
		}
		return ans;
	}
	ll sol() {
		ll ans=0;
		while(bfs()) ans+=dfs(S,inf);
		return ans;
	}
}
int main() {
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>m>>S>>T;
	flow::init();
	for(int i=1; i<=m; i++) {
		int x,y,z;
		cin>>x>>y>>z;
		flow::add_edge(x,y,z);
	}
	cout<<flow::sol()<<'\n';
	return 0;
}



回复

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

正在加载回复...