杂题
题意
给定\(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\)之间连最短路这条边优