高斯消元

Published: by Creative Commons Licence

  • Tags:

算法流程

随便找一本代数的书,都可以找到算法流程。

题目1:给定n个顶点的一个无向图,要求将顶点分成两个子图,跨越子图的边统统删去。要求使得最后拥有偶数度数的顶点最多。问如何分组。其中1n2000,保证无自环。

提供一道问题

首先我们考虑有n个未知数x1,,xn,其中xi=0表示将i分到第一组,xi=1表示分到第二组。

现在我们尝试使所有顶点都变成偶数度数。这时候一条边(u,v)的对顶点uv的度数会产生相同的贡献:xu+xv+1。我们从而可以得到一个方程组Ax=b。可以发现A是一个对称矩阵,且bi=Ai,i。这里所有的运算都发生在Z2上。

之后我们证明我们的方程组始终是有解的。假设无解,即存在一个行的线性组合,使得左边为0,右边非0。考虑选择的行为r1,,rk。这时候左边第j列的和Ar1,j+Ar2,j++Ark,j=0,故我们同样可以得到ki=1kj=1Ari,rj=0,考虑到A是对称的,因此可以化简为ki=1Ari,ri=ki=1bi=0,这和我们之前提到的右边和非0相悖,因此可以证明方程组始终有解。

这里由于是Z2上的运算,因此我们可以用bitset来加速,时间复杂度为O(n332)