有关spfa的一点小问题
查看原帖
有关spfa的一点小问题
491637
fu_dan_de_zhu楼主2023/2/4 00:08

萌新请教。 我用cnt数组表示从0号点到该点的最短路经过几个点,采用邻接表(前向星写法)存储图,dist表示每个点到超级源点(0号点)的最短路,st表示每个点是否在队列中。 先上代码(AC的spfa函数),问题在代码下面

bool spfa()
{
	memset(dist,0x3f,sizeof(dist));
	dist[0]=0;
	q.push(0);
	st[0]=1;
	cnt[0]=1;
	while(!q.empty())
	{
		int t=q.front();
		st[t]=0;
		q.pop();
		for(int i=h[t];~i;i=ne[i])
		{
			int j=e[i];
			if(dist[j]>dist[t]+w[i])
			{
				dist[j]=dist[t]+w[i];
				if(!st[j])
				{
					cnt[j]++;
					st[j]=1;
					if(cnt[j]>=n+1)
					{
						return 0;
					}
					q.push(j);
				}
				
			}
		}
	}
	return 1;
}

为什么更新cnt的时候必须得放在if(!st[j])里,而且为什么是cnt[j]++ 如果换成下面这种写法就会WA掉最后一个点

dist[j]=dist[t]+w[i];
cnt[j]=cnt[t]+1;
if(cnt[j]>=n+1)
{
	return 0;
}
if(!st[j])
{
	st[j]=1;
	q.push(j);
}
2023/2/4 00:08
加载中...