想请教大佬,这么写spfa为什么会超时,有什么改进办法?
  • 板块P1137 旅行计划
  • 楼主Hayya
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/18 13:22
  • 上次更新2024/11/18 14:32:11
查看原帖
想请教大佬,这么写spfa为什么会超时,有什么改进办法?
1413040
Hayya楼主2024/11/18 13:22
#include<bits/stdc++.h>
using namespace std;
int team[200001],n,m,num[100005],x,y,dis[100005],head,tail,u,dt[200005],dt2[200005],ans[100005];
bool exist[100001];
int *a[100005];
int main()
{
	ios::sync_with_stdio(false);
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>dt[i]>>dt2[i];
		num[dt[i]]++;
	}
	for(int i=1;i<=n;i++)
	a[i]=new int[num[i]];
	for(int i=1;i<=m;i++)
	{
		*a[dt[i]]=dt2[i];
		a[dt[i]]++;
	}
	for(int i=1;i<=n;i++)
	a[i]-=num[i];
	for(int ii=1;ii<=n;ii++)
	{
    memset(exist,false,sizeof(exist));
    memset(team,0,sizeof(team));
    memset(dis,0,sizeof(dis));
	dis[ii]=1;
	exist[ii]=true;
	team[1]=ii;
	head=0;
	tail=1;
	do
	{
		head++;
		head=((head-1)%200001)+1; 
		u=team[head];
		exist[u]=false;
		for(int i=1;i<=num[u];i++,a[u]++)
		{
			if(dis[*a[u]]<dis[u]+1)
			{
				dis[*a[u]]=dis[u]+1;
				if(!exist[*a[u]])
				{
					tail++;
					tail=((tail-1)%200001)+1;
					team[tail]=*a[u];
					exist[*a[u]]=true;
				}
			}
		}
		a[u]-=num[u];
	}while(head!=tail);
	for(int i=1;i<=n;i++)
	ans[i]=max(ans[i],dis[i]);
	}	
	for(int i=1;i<=n;i++)
	cout<<ans[i]<<endl;
	return 0;
}
2024/11/18 13:22
加载中...