CF1630F Making It Bipartite

题面

图上有 \(n\) 个点,点有点权,点权互不相同,如果两个点点权成倍数关系,那么他们有边。
现在希望删去一些点,来使图变成二分图,求出最少删去多少点。
\(n,a_i \le 5\times 10^4\)


题解

  暴力 网络流 最小链覆盖

  终于落实了咕了两个月的题目(感谢 C202044zxy 催更)

  首先,暴力建图是显然复杂度正确的(互不相同 \(\to\) 调和级数)。

  但是这个图有些性质,也就是我们不能找到一条路径 \(x \to y \to z\),这样一定有边 \(x \to z\),那么即形成了三元环了。

  这个条件等价于每个点要么不存在,要么只有入度,要么只有出度。

  然后到这里就不会了

  之后可能算一个建模套路吧,我们将每个点 \(x\) 拆成 \(x\)\(x'\)\(x\) 表示这个点是最后只有入度,\(x'\) 表示最后只有出度,然后我们在相矛盾的点之间连上边,最后要求尽量选择更多的点使得两两之间无边。(这个有点类似与 \(\tt 2sat\))。

  但是这个和 \(\tt 2sat\) 不同,我们可以删点,也就是一个点的两个分身都不选,同时这个问题要求选择的点尽可能地多。

  然后我们可以发现,我们可以将边以一种方式定向成为有向图,并且成为一个 \(\tt DAG\),然后就转化成最长反链的问题了。

  通过简单尝试,我们可以找到以下连边方案:

  • \(u \to u'\),表示入度出度不能同时拥有。
  • 对于每条边 \(u \Rightarrow v\),我们有 \(u \to v', u \to v, u' \to v'\),也就是两个点只能 \(u\) 有出度,\(v\) 有入度,其他情况是不合法的。

  显然这是一个偏序集,也就是一个 DAG。

  直接建立二分图,跑出最长反链就行了。因为 最长反链 = 最小链覆盖 = 点数 - maxflow = 2 * n - maxflow,因此答案就是 n - (2 * n - maxflow) = maxflow - n

  代码

启示

  1. 当发现无法表示当前决策 / 状态的时候,可以选择拆点。(感觉是 \(\tt 2sat\) 或者网络流 的老套路了,但还是时不时忘记 😅)
  2. 无向图最大独立集是 N-P 困难的,但是我们可以通过题目的性质建立偏序集,然后转化为 DAG,于是问题就可以用最长反链解决了。由此可见通过构造将无向图转为有向图还是比较有用的。
posted @ 2022-03-16 20:19  Werner_Yin  阅读(188)  评论(1编辑  收藏  举报