拓扑排序 + 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)\) 是一条可经过的边。
不难想到两条最短路的交点一定是连续的。
那么只需要把所有共同经过的边加到一个有向无环图中再跑最长路即可。