高斯消元
算法流程
随便找一本代数的书,都可以找到算法流程。
题目1:给定n个顶点的一个无向图,要求将顶点分成两个子图,跨越子图的边统统删去。要求使得最后拥有偶数度数的顶点最多。问如何分组。其中1≤n≤2000,保证无自环。
提供一道问题。
首先我们考虑有n个未知数x1,…,xn,其中xi=0表示将i分到第一组,xi=1表示分到第二组。
现在我们尝试使所有顶点都变成偶数度数。这时候一条边(u,v)的对顶点u和v的度数会产生相同的贡献:xu+xv+1。我们从而可以得到一个方程组Ax=b。可以发现A是一个对称矩阵,且bi=Ai,i。这里所有的运算都发生在Z2上。
之后我们证明我们的方程组始终是有解的。假设无解,即存在一个行的线性组合,使得左边为0,右边非0。考虑选择的行为r1,…,rk。这时候左边第j列的和Ar1,j+Ar2,j+…+Ark,j=0,故我们同样可以得到∑ki=1∑kj=1Ari,rj=0,考虑到A是对称的,因此可以化简为∑ki=1Ari,ri=∑ki=1bi=0,这和我们之前提到的右边和非0相悖,因此可以证明方程组始终有解。
这里由于是Z2上的运算,因此我们可以用bitset来加速,时间复杂度为O(n332)。