洛谷2934 BZOJ3411
- 题意
有$n (1 \le n \le 100000)$个点,$m (1 \le m \le 200000)$条边的无向图,点1为起点。求到达每个点不走原最短路径上最后一条边时的最短距离。保证最短路唯一。
Solution
- 刚看到这道题的时候不会做,搜了题解,写了个好巧妙的树链剖分。后来发现竟然还有dfs做法,左偏树做法。
- 我也太垃圾了吧。
上面是废话。下面进入正题。
- 由于题目保证最短路唯一,所以跑完最短路之后得到的是一个最短路树而不是DAG。当最短路树上到这个点的最后那条边被截断后,就u要经过至少一条不在最短路树上的边。
- 一一考虑其他的每条边。
- 设当前考虑不在最短路树上的边
<u,v>
,设$x=LCA(u,v)$。那么对于路径P<v,x>(不包括x)
上的任意点$t$,都可以更新:$dis2[t] = min(dis2[t], dis[u]+w[u,v]+dis[v]-dis[t])$。路径P<u,x>
类似。 - 可以发现$dis[u] + w[u,v] + dis[v]$是一个定值,树剖维护即可。
- tips
- 看来我对稍复杂一点的结构运用还不够。
- spfa好写,但是小心TLE。
|
|