分析
当两个城市可以互相到达的时候,最优路线一定位于原图的最大生成森林上,这个可以通过反证法证明。
这题是LCA经典应用:静态树上链的权值查询问题。
因为两点间的路径肯定就要走到LCA。只要在求LCA的时候,往上跳一次就更新一次最小值即可,也就是 a n s = m i n ( a n s , m i n ( d i s [ x ] [ i ] , d i s [ y ] [ i ] ) ) ; ans=min(ans,min(dis[x][i],dis[y][i])); ans=min(ans,min(dis[x][i],dis[y][i]));,这句要放在 x , y x,y x,y 更新之前。
d i s [ i , j ] dis[i,j] dis[i,j]表示从 i i i出发向上走 2 j 2^j 2j 步的所有点的边权最小值。转移: d i s [ i , j ] = m i n ( d i s [ i , j − 1 ] , d i s [ f [ i , j − 1 ] , j − 1 ] ) dis[i,j]=min(dis[i,j-1],dis[f[i,j-1],j-1]) dis[i