拓撲排序 + dijkstra。
先對 A 點、C 點跑一次最短路,再對反圖跑一次 B 點、D 點的最短路,則對於一個點 \(u\) 滿足:
\[d(a, u) + d(b, u) = d(a, b)
\]
\[d(c, u) + d(d, u) = d(c, d)
\]
\(u\) 就是兩條最短路經過的點。
若:
\[d(a, u) + d(b, v) + w = d(a, b)
\]
\[d(c, u) + d(d, v) + w = d(c, d)
\]
則 \((u \to v, w)\) 是一條可經過的邊。
不難想到兩條最短路的交點一定是連續的。
那麼只需要把所有共同經過的邊加到一個有向無環圖中再跑最長路即可。