求助 萌新重写Dinic结果TLE
  • 板块灌水区
  • 楼主Minecraft万岁
  • 当前回复11
  • 已保存回复11
  • 发布时间2020/7/10 22:11
  • 上次更新2023/11/6 23:18:59
查看原帖
求助 萌新重写Dinic结果TLE
219198
Minecraft万岁楼主2020/7/10 22:11

RT 一直TLE 真的查不出来了

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll oo=0x7ffffff;
struct node
{
	ll nxt;
	ll to;
	ll dis;
}e[50005];
ll cnt=-1;
ll head[50005],cur[50005];
ll from[50005];
ll dep[50005];
ll x,y,z;
ll maxflow;
ll n,m,s,t;
queue<ll> Q;
inline void read(ll &x)
{
	ll f=1;char c;
	for(x=0,c=getchar();c<'0'||c>'9';c=getchar()) if(c=='-') f=-1;
	for(;c>='0'&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48); x*=f;
}
inline ll mx(ll _x,ll _y)
{
	return _x>_y?_x:_y;
}
inline ll mn(ll _x,ll _y)
{
	return _x<_y?_x:_y;
}
inline void add(ll from,ll to,ll dis)
{
	e[++cnt].nxt=head[from];
	e[cnt].to=to;
	e[cnt].dis=dis;
	head[from]=cnt;
}
inline bool bfs(ll s,ll t)
{
	memset(dep,-1,sizeof(dep));
	for(ll i=1;i<=n;i++) cur[i]=head[i];
	while(!Q.empty()) Q.pop();
	dep[s]=0;
	Q.push(s);
	while(!Q.empty())
	{
		ll tp=Q.front();
		Q.pop();
		for(ll i=head[tp];i!=-1;i=e[i].nxt)
		{
			ll to=e[i].to;
			if(dep[to]==-1&&e[i].dis!=0)
			{
				dep[to]=dep[tp]+1;
				Q.push(to);
			}
		} 
	}
	if(dep[t]==-1) return false;
	else return true;
} 
inline ll dfs(ll now,ll t,ll limit)
{
	if(now==t) return limit;
	ll flow=0,f;
	for(ll i=cur[now];i!=-1;i=e[i].nxt)
	{
		cur[now]=i;
		ll to=e[i].to;
		if(dep[to]==dep[now]+1&&e[i].dis>0)
		{
			f=dfs(to,t,mn(limit,e[i].dis));
			if(f>0)
			{ 
				flow+=f;
				limit-=f;
				e[i].dis-=f;
				e[i^1].dis+=f;
				if(limit==0) return flow;
			} 
		}
	}
	return flow;
}
inline ll Dinic(ll s,ll t)
{	
	while(bfs(s,t))				
	{	
		maxflow+=dfs(s,t,1e9);
	}
}
int main()
{
	memset(head,-1,sizeof(head));
	read(n);read(m);read(s);read(t);
	for(ll i=1;i<=m;i++)
	{
		read(x);read(y);read(z);
		add(x,y,z);
		add(y,x,0);
	}
	Dinic(s,t);
	printf("%lld\n",maxflow);
	return 0;
}

2020/7/10 22:11
加载中...