为何超级源点的使用会影响spfa的正确性?
for(int i=1;i<=n;i++) adde(0,i,1);
for(int i=1;i<=n;i++)
{
dis[i]=1;
q.push(i);
st[i]=true;
}
在我的提交记录中,可以看出会在多个点输出不该输出的-1
附上spfa代码
超级源点
bool spfa(int s)
{
queue<int> q;
for(int i=1;i<=n;i++) dis[i]=-1e18,cnt[i]=-1;
for(int i=1;i<=n;i++) st[i]=0;
dis[s]=0;
q.push(s);
st[s]=1;
while(!q.empty())
{
int x=q.front();
q.pop();
st[x]=0;
if(tot>=2e7+n+1)
{
return false;
}
tot++;
for(int i=head[x];i;i=e[i].nxt)
{
int v=e[i].v;
cout<<v<<endl;
if(dis[v]<dis[x]+e[i].w)
{
dis[v]=dis[x]+e[i].w;
if(!st[v])
{
cnt[v]++;
if(cnt[v]>n+1) return false;
st[v]=1;
q.push(v);
}
}
}
}
return true;
}
后者的AC代码
while(!q.empty())
{
int x=q.front();
q.pop();
st[x]=false;
if(tot>=2e7)
{
return false;
}
tot++;
for(int i=head[x];i!=-1;i=e[i].nxt)
{
int v=e[i].v;
if(dis[v]<dis[x]+e[i].w)
{
dis[v]=dis[x]+e[i].w;
if(st[v]==false)
{
cnt[v]++;
if(cnt[v]>n) return false;
st[v]=true;
q.push(v);
}
}
}
}
return true;