路径记录 #
我们开一个vector<int> pre[N]
用来记录某个点的前一个点,在更新距离的时候,如果当前距离更短就舍弃掉之前的记录,将当前点作为被更新点的前一个点;如果当前距离和最短距离相等就在数组里加上这个点。
for(pii it:E[u]){
ll v=it.S,cost=it.F;
if(!vis[v]&&dis[v]>dis[u]+cost){
dis[v]=dis[u]+cost;
pre[v].clear();
pre[v].pb({cost,u});
q.push({dis[v],v});
}else if(dis[v]==dis[u]+cost)
pre[v].pb({cost,u});
}
最短路径的数量 #
和路径记录类似,如果更短就让数目等于 1,如果一样就加 1。
if(!vis[v]&&dis[u]+cost<dis[v]){
cnt[v]=1;
dis[v]=dis[u]+cost;
}else if(dis[u]+cost==dis[v]){
cnt[v]++;
}