题目:
给出一个 个顶点 条边的无向无权图,顶点编号为 ~ 。问从顶点 开始,到其他每个点的最短路有几条。
题解:
用一个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];
}