Classic-Reverse

[链接]

题目大意

给定一个 \(n\) 个点 \(m\)条边无向图,每条边有边权0/1。有两种操作:

  1. 取一个简单环,将环上的所有边边权取反。
  2. 将图分成两个点集,将跨越两个点集的边边权取反。
    求是否可能经过 \(m+1\) 次,将所有边权变成0。\(n\leq 100\)

题解

先不管次数限制。考虑这种情况下二操作可以等价于先选取若干个点,将这些点连出的边取反。

由于取反这个操作与顺序无关,所以我们考虑先进行2操作再进行1操作。

考虑什么时候1操作可以将一个图的所有边权变成0。可以发现,这本质时用若干个环经过边权为1的边奇数遍,0的边偶数遍。

显然这当且仅当所有点相连的边权为1的边为偶数条。

我们考虑边权比较难处理,将其化成点权,即每个点的点权是所有相连的边的边权的异或和。

可以发现,1操作成立当且仅当所有点点权为0。

我们再考虑将2操作转换成点权:对某个点操作,相当于将其相邻的点的点权取反。

特别的,如果一个点入度为奇数,它也会把自己的点权取反。

这样题目就变成了:有一个长度为 \(n\) 的01序列,有 \(m\) 种操作,第 \(i\) 种操作可以把集合 \(S_i\) 中的元素取反。问是否可以把序列变成0。

显然这就是线性基裸题了。直接将序列看成 \(n\) 位的二进制数即可。

最后考虑一个问题:怎么保证可以在 \(m+1\) 步内完成。下面给出一种构造:

首先如果一条边两边的点都进行了操作2,其实这条边没有影响。

所以我们将需要进行操作的点放在一个集合里,其他点放在另一个集合里,进行一次操作2。因为完全在某个集合内的边不会受到影响,所以这样等同于做很多此操作2。

再考虑操作1。可以贪心每次取最大的全是1的环。因为取完后每个点的点权是不变的,所以这样一定是可行的。显然这个操作数一定不大于 \(m\)

所以最后总操作数不大于 \(m+1\)

时间复杂度 \(O(\frac {n^3} \omega)\)

猜你喜欢

转载自www.cnblogs.com/Flying2018/p/13365808.html
今日推荐