题解 P3429 [POI2005] DWA-Two Parties
本题现有题解没有提供答案为
将人看做点,认识关系看作无向边,原题意等价于:给定一张无向图,
记点
假设好点个数可以为
若该方程组有解,那么容易构造出使好点个数为
若该方程组无解,则必然能将某几行异或起来,使得等号左边各未知数系数均为
称点
- 选择了奇数个奇度点(右边异或和为
1 ) - 每个被选择的奇度点的邻域内都选了奇数个点,其他点的邻域内都选了偶数个点(左边各未知数系数均为
0 )
可以根据
高斯消元解该方程组,输出方案即可,时间复杂度
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=205;
int n,m,b[N];
bitset<N>a[N];
int main(){
scanf("%d",&n);
for(int i=1,l,x;i<=n;++i){
scanf("%d",&l),a[i][n+1]=a[i][i]=l&1;
while(l--) scanf("%d",&x),a[i][x]=1;
}
for(int i=1,l;i<=n;++i){
for(l=i;l<=n&&!a[l][i];++l) ;
if(l<=n){
if(l^i) swap(a[i],a[l]);
for(l=1;l<=n;++l) if(l!=i&&a[l][i]) a[l]^=a[i];
}
}
for(int i=n;i;--i) if(a[i][i]&a[i][n+1]) b[++m]=i;
printf("%d\n",m);
while(m) printf("%d ",b[m--]);
return 0;
}