其他分享
首页 > 其他分享> > CF938D题解

CF938D题解

作者:互联网

题面

Description:
给定一个 \(n(1\leq n\leq2\times10^5)\) 个点的无向图 \(G\) 和数组 \(a\),对于每个 \(i(1\leq i\leq n)\),求出 \(\min_{j=1}^n(2\times\operatorname{dis}(i,j)+a_j)\)。


因为题目把所有路径长度乘了个 \(2\),所以下文的讲述中默认将边权 \(\times2\)。
如果我只做一个点,那显然直接跑最短路算法即可。
但是我有 \(n\) 个点,显然不能一个一个做所以考虑建立一个超级源点,指向每一个点,边权为 \(a_i\)。这样我们就顺带搞定了最后加上 \(a_i\) 这个要求。
因为路是双向的,所以从 \(i\) 到 \(j\) 可以转化为从 \(j\) 到 \(i\),这样我们可以发现取点对 \((i,j)\) 其实就是从超级源点走到 \(j\) 然后从 \(j\) 走到 \(i\)。那就是从超级源点走到 \(i\)。这样我们就证明了 \(2\operatorname{dis}(i,j)+a_j=\operatorname{dis}(0,j)+\operatorname{dis}(j,i)=\operatorname{dis}(0,i)\)。这样,我们就把问题转化为了从超级源点走到 \(i\) 的最短路问题。于是这个题就做完了。

代码

标签:题解,超级,源点,operatorname,leq,CF938D,边权,dis
来源: https://www.cnblogs.com/1358id/p/16293577.html