参考第一篇题解,在dijkstra中
inline void Dijkstra(int s,ll dis[],int f=0){
for(int i=1;i<=n;++i) dis[i]=Inf;
dis[s]=0;
pq.push((Node){s,0});
while(!pq.empty()){
Node fa=pq.top();pq.pop();
int x=fa.pos;
if(fa.dis>dis[x]) continue;
for(int i=head[x],y;i;i=e[i].nxt){
y=e[i].to;
if(dis[y]>fa.dis+e[i].len){
lstvis[y]=e[i].id;
dis[y]=fa.dis+e[i].len;
if(f==1&&!On_path[y]) l[y]=l[x];
if(f==2&&!On_path[y]) r[y]=r[x];
pq.push((Node){y,dis[y]});
}
}
}
}
在注释处的两行,我没有用on_path[y]来判断,而是判断如果边(x,y)不在1到n的最短路上就更新l,r。这样的做法会WA on #16。所以想问一下用边判断和用点判断有什么区别,谢谢。