CF Gym 102994 Travel Dream
题意
求一张带权无向图中最大的 \(k\) 元简单环,无解输出 impossible
。
\(1 \le n, m \le 300, k \le 10\)。注意 \(k\) 的范围
题解
\(k\) 很小,存在简单办法对小环小链进行预处理,考虑折半。首先考虑怎么求长度小于等于 4 的链。长度为 \(1, 2\) 的链可以直接枚举,长度为 \(3\) 的链枚举两条不相交的边即可。长度为 \(4\) 的链也可以枚举两条边然后拼上一个长度为 \(2\) 的链,但是中间的点不能和端点重复。这其实不太能做,但是我们是要最优化而不是计数,所以可以只存长度为 \(2\) 的链的前三名,这三条路径中至少有一条不和端点相交,因为端点只有 \(2\) 个。于是预处理就结束了。
接下来考虑枚举两条边,把两个链拼起来,难点在于不能重复。怎么办呢?考虑随机黑白染色,这是一个很高明而且很有启发性的策略,一定要记住!强制预处理出的链都要是同色的,然后拼接的时候一定要将黑色链和白色链拼起来,这样节点一定不重复。考虑这个东西的错误率,差不多是 \(1 - \dfrac{k}{2^{k-1}} \le \dfrac{251}{256}\)。发现上面的计算是 \(\Theta(m^2)\) 的,那么你完全可以做个 \(1000 \sim 1500\) 次,正确率就非常高了。