萌新请教。
我用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);
}