社区讨论

60pts RE&WA 求条(Dinic)

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

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mipuhjgm
此快照首次捕获于
2025/12/03 18:09
3 个月前
此快照最后确认于
2025/12/03 18:15
3 个月前
查看原帖
rt
CPP
//Network Stream 
//Code by LittleI
#include <bits/stdc++.h>
#define int long long
#define mp make_pair
#define ft first
#define sc second
using namespace std;
const int inf=1ll<<60;
int n,m,s,t;vector<pair<int,int> >g[20003];
int ans=0,dep[20003];
bool bfs()
{
	memset(dep,-1,sizeof(dep));
	queue<int>q;
	q.push(s);dep[s]=0;
	while(!q.empty())
	{
		int u=q.front();q.pop();
		for(auto vv:g[u])
		{
			int v=vv.ft,w=vv.sc;
			if(dep[v]==-1&&w>0)
				dep[v]=dep[u]+1,
				q.push(v);
//			if(v==t) return 1;
		}
	}
	return (dep[t]==-1);
}
int dfs(int u,int f)
{
	if(u==t) return f;int used=0;
	for(int i=0;i<(int)g[u].size();i++)
	{
		auto vv=g[u][i];
		int v=vv.ft,w=vv.sc;
		if(w&&dep[v]==dep[u]+1)
		{
			int ww=dfs(v,min(f-used,w));
			if(ww>0) used+=ww,g[u][i].sc-=ww,g[v][i^1].sc+=ww;
			if(used==f) return f;
		}
	}
	if(!used) dep[u]=-1;
	return used;
}
void dinic()
{while(!bfs()) ans+=dfs(s,inf);}
signed main()
{
	cin >> n >> m >> s >> t;
	for(int i=1;i<=m;i++)
	{
		int u,v,w;cin >> u >> v >> w;
		g[u].emplace_back(mp(v,w));
		g[v].emplace_back(mp(u,0));
	}
	dinic();
	cout << ans;
	return 0;
}

回复

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

正在加载回复...