首先 \(a\) 边可以随便选。
显然,若某条 \(b\) 边的两端位于同一 \(a\) 连通块,一定不会被我们考虑。剩下的 \(b\) 边一定会将两个 \(a\) 连通块相连。
那么此时我们对于 \(b\) 边的约束是,位于一个环上的 \(b\) 边不能同时存在图中,即,我们的路径不能从当前连通块出发,经过至少一条 \(b\) 边后再回到当前连通块。
所以很自然的想法是最短路更新时记录当前已经到达的连通块集合,但显然当连通块个数过多时这个做法是寄掉的。此时请先将可能规模过大的做法作为候选做法,并记录在什么情况下会无法通过,如发现无法绕开,可以再回来优化候选做法。
考虑规模较小的连通块:
- 对于大小为 \(1\) 的连通块,显然不会出现绕一圈再回来的情况。
- 对于大小为 \(2,3\) 的连通块,由于出去绕一圈至少要经过两条 \(b\) 边,连通块内的直径最多只有两条 \(a\) 边,而 \(a<b\),所以也一定不会绕一圈。
故我们只需要记录大小 \(\ge 4\) 的连通块的经过情况,此时有效连通块个数至多只有 \(\frac{n}{4}\) 个,就可以状压了,状态总数为 \(O(2^{\frac{n}{4}}n)\),设 \(w=2^{\frac{n}{4}}n\),则 dijkstra 总时间复杂度为 \((w\log w)\)。
优化前请仔细分析复杂度瓶颈。
特定地,对于有关连通块个数的状压,可以讨论掉较小连通块来降低复杂度。
标签:连通,Abandoning,frac,复杂度,个数,Roads,做法,CF1149D From: https://www.cnblogs.com/ydtz/p/17762702.html