题目:
给出一个NNN个顶点MMM条边的无向无权图,顶点编号为111~NNN 。问从顶点111开始,到其他每个点的最短路有几条。
题解:
用一个b数组来存路径,如果遇到可以从某点经过k(中转点)点到终点,且最短路与此时相同,那么路径数为:
路径数 = 起点最短路径数 + 终点最短路径数 + 1
如果遇到更短的最短路,那么路径为:
路径数 = 起点最短路径数
初值:起点步数置为1
局部代码:
int Dijkstra(int s, int t) {
qu.push(edge(s, 0));
dj[s] = 0;
b[s] = 1;
while(!qu.empty()) {
edge r = qu.top();
qu.pop();
if(vis[r.qi]) {
continue;
}
vis[r.qi] = 1;
for(int i = 0;i < ve[r.qi].size(); i++) {
node p = ve[r.qi][i];
if(dj[r.qi] + p.v < dj[p.u]) {
b[p.u] = b[r.qi];
b[p.u] %= 100003;
dj[p.u] = dj[r.qi] + p.v;
qu.push(edge(p.u, dj[p.u]));
}
else if(dj[p.u] == dj[r.qi] + p.v) {
b[p.u] += b[r.qi];
b[p.u] %= 100003;
}
}
}
return dj[t];
}

本文介绍了一道图论问题,探讨如何在无向无权图中计算从顶点1出发到其他所有顶点的最短路径数量。通过使用b数组记录路径,并结合最短路径更新策略,可以得出每条最短路径的计数。文章提供了解题思路和局部代码实现。
920

被折叠的 条评论
为什么被折叠?



