描述
有一个nodes
个节点edges
条边的无向无环图. 每条边权重相同(可以认为都是1
). 我们关心节点s
和节点t
. 现在需要建一条(之前不存在的)边, 问一共有多少种方案. 要求添加新边之后的s
和t
之间的最短距离不变.
思路
依旧是floyd
中间点的思想, 不过本题中间点有两个(i
, j
), 其中一个可以是s
或t
. 分别以s
和t
为起点做bfs, 求出s
点到任意点i
的最短路数组ds[i]
, 和t
点到任意点i
的最短路数组dt[i]
.
对于任意的中间节点i
和j
, 只要满足ds[i] + 1 + dt[j] >= ds[t]
和ds[j] + 1 + dt[i] >= ds[t]
, 说明经过新修建的边从s
到t
的距离并没有变短, i
和j
之间允许建一条直接相连的边.
代码
1 | import collections |