题目解析
令 DiD_iDi 为从城市 111 到城市 iii 的最短距离。无论选择哪些道路,显然有 di≥Did_i\geq D_idi ≥Di 。
所以如果有选择道路的方案使得 di=Did_i=D_idi =Di 成立,那么这就是最优解。事实上,这样的选择方法总是存在的。
对于每个 i=2,3,…,Ni=2,3,\ldots,Ni=2,3,…,N,只需保留 “从城市 111 到城市 iii 的最短路径中的最后一条道路” 即可。
答案可以通过记录 Dijkstra\tt{Dijkstra}Dijkstra 算法中到达每个城市前的最后一条道路来找到。
AC代码
C++ AC代码:
Python AC代码:
复杂度分析
使用 Dijkstra\tt{Dijkstra}Dijkstra 算法求最短路,并在过程中记录路径,时间复杂度为 O(MlogM)\mathrm{O}(M \log{M})O(MlogM)。