CF1149D 题解
CF1149D 简要题解
题意:
有两种道路,通行时间分别为 \(a,b(a< b)\)。对于每个 \(i\) ,求出所有最小生成树中 \(1\) 到 \(i\) 的最短通行时间。
做法:
要求出 \(1\) 到 \(i\) 的最短通行时间,看着就像是 \(dij\) 。只是 \(dij\) 的时候走的边需要是可能的最小生成树上的边。
所以接下来我们来讨论哪些边不会被 \(dij\) 用到:
一
根据 \(kruskal\) ,我们可以先用掉一些通行时间为 \(a\) 的边,然后这样就会形成若干个连通块。
然后我们就需要在连通块之间连通行时间 \(b\) 的边来形成一颗最小生成树。
那么连通块内部的通行时间为 \(b\) 的边就永远不会 \(dij\) 被用到(这样就不是最小生成树了)。
二
考虑连通块之间的情况,我们知道最小生成树中连通块之间不能有环:
但是 \(dij\) 时有可能会出现先离开了一个连通块,然后又进入了连通块的情况,这样就会导致连通块之间出现了环,导致出现问题。

比如此图,实际上 \(1→4\) 的最短路径是绿色路线 。\(1→7,7→4\) 是不对的,因为 \((1,2,3,4)\) 这个连通块和 \((5,6,7)\) 这个连通块被连接了两次。
考虑 \(dij\) 时用状压来记录已经离开过的连通块。
但这样状态就是 \(2^{70}\) 显然无法做,但接着就能发现我们只需要把大小大于等于 \(4\) 的连通块状压起来,这是因为:
大小小于等于 \(3\) 的连通块中任意两个点的距离不超过 \(2\times a\) ,而离开这个连通块再进来的距离至少是 \(2\times b\) ,显然更劣。
所以 \(dij\) 自动就能处理这种情况,不用特殊处理。
这样就做完了。

浙公网安备 33010602011771号