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\) 的最短路问题。于是这个题就做完了。

代码

posted @ 2022-05-20 19:51  1358id  阅读(24)  评论(0编辑  收藏  举报