[链接]
题目大意
给定一个 \(n\) 个点 \(m\)条边无向图,每条边有边权0/1。有两种操作:
- 取一个简单环,将环上的所有边边权取反。
- 将图分成两个点集,将跨越两个点集的边边权取反。
求是否可能经过 \(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)\)。