杂题

题意

给定\(n\)个点,\(m\)条带权边的无向图,走过第\(i\)条边,血槽中的血会下降\(v_i\)点,如果不足\(v_i\)点,这人会当场去世。
\(n\)个点中,有若干个是关键点,在这些关键点可以将血槽补满。
\(q\)次询问,每次问一个玩家的血槽至少需要多大,才能从\(x\)走到\(y\)
保证\(x,y\)是关键点

做法

若所有点均为关键点,则搞个MST查询路径最小值即可

可以将关键点两两之间求最短路然后用其作新图的边,搞个MST
但这样边数是\(O(n^2)\)

对于原图的点\(i\),令\(from_i\)\(i\)最近的关键点,\(dis_i\)为距离
\((u,v,w)\in E\)\(from_u\neq from_v\),则将新图加入\((from_u,from_v,dis_u+dis_v+w)\)

正确性:
对于关键点\(x,y(x\neq y)\),其在原图的最短路径上,若均不满足\((u,v)\in E\)\(from_u=x,from_v=y\)
则通过最短路径上生成的边,会比\(x,y\)之间连最短路这条边优

posted @ 2020-06-14 21:24  Grice  阅读(93)  评论(0编辑  收藏  举报