求助网络流/kel
查看原帖
求助网络流/kel
648933
HarmonicQuadrilatera楼主2023/1/12 10:52

RT。

以下是我的网络流代码,可以通过模板题,但数据稍大(如 n=3×104n=3\times 10^4)就会 TLE。

我认为自己写的是 dinic(甚至加了当前弧优化),但是 wjq 神仙说我写的是 EK。所以我写的到底是什么呢?本蒟蒻网络流学的不好,请大佬多多指教。/kk

#include<bits/stdc++.h>
#define int long long
#define N 205
#define M 5005
#define _ make_pair
using namespace std;
struct ljb{
	int en,v[2*M],w[2*M],fst[N],nxt[2*M];
	inline void add(int x,int y,int z)
	{
		en++;
		v[en]=y;
		w[en]=z;
		nxt[en]=fst[x];
		fst[x]=en;
	}
}; 
ljb g;
int n,m,s,t,ans,dis[N],dqh[N];
queue<pair<int,int> > qu;
inline int cp(int x){return x&1?x+1:x-1;}
inline bool bfs()
{
	memset(dis,63,sizeof(dis));
	for(int i=1;i<=n;i++) dqh[i]=g.fst[i];
	while(!qu.empty()) qu.pop();
	qu.push(_(s,0));
	while(!qu.empty())
	{
		int now=qu.front().first,d=qu.front().second;
		qu.pop();
		if(dis[now]<1e18) continue;
		dis[now]=d;
		for(int i=g.fst[now];i;i=g.nxt[i])
		{
			int s=g.v[i],w=g.w[i];
		//	cout<<now<<"--"<<w<<"->"<<s<<endl;
			if(w>0) qu.push(_(s,d+1));
		}
	}
	return dis[t]<1e18;
}
inline int dfs(int x,int y)
{
	if(x==t) return y;
	int sy=y;
	for(int i=dqh[x];i;i=g.nxt[i])
	{
		int s=g.v[i],t=g.w[i];
		if(dis[s]<=dis[x]||t==0) continue;
		dqh[x]=i;
		int f=dfs(s,min(sy,t));
		g.w[i]-=f;
		g.w[cp(i)]+=f;
		sy-=f;
		if(sy<=0) break;
	}
	return y-sy;
}
signed main()
{
	cin>>n>>m>>s>>t;
	for(int i=1;i<=m;i++)
	{
		int x,y,z;
		scanf("%lld%lld%lld",&x,&y,&z);
		g.add(x,y,z);
		g.add(y,x,0);
	}
	while(bfs()) ans+=dfs(s,1e18);
	cout<<ans;
	return 0;
}
2023/1/12 10:52
加载中...