P2962 [USACO09NOV]灯Lights
guass消元异或方程组
#include<bits/stdc++.h>
using namespace std;
#define maxn 100
#define sc(x) scanf("%lld",&x);
#define int long long
int A[maxn][maxn];
int x[maxn];
int ans=1000;
int n,m;
void guass()
{
for(int i=1; i<=n; i++)
{
int t=i;
if(!A[t][t])
{
for(int j=i+1; j<=n; j++)
{
if(A[j][i])
{
t=j;
break;
}
}
swap(A[i],A[t]);
}
for(int k=i+1; k<=n; k++)
{
if(A[k][i])
{
for(int j=1; j<=n+1; j++)
{
A[k][j]^=A[i][j];///消元
}
}
}
}
}
void dfs(int i,int t)
{
if(t>ans)return;
if(i==0){
ans=min(t,ans);
return;
}
if(A[i][i]){
x[i]=A[i][n+1];
for(int j=i+1;j<=n;j++)
if(A[i][j]){x[i]^=x[j];}
if(x[i])dfs(i-1,t+1);
else dfs(i-1,t);
}else{
x[i]=0;
dfs(i-1,t);
x[i]=1;
dfs(i-1,t+1);
}
}
signed main()
{
sc(n);sc(m);
int x,y;
while(m--){
sc(x);sc(y);
A[x][y]=A[y][x]=1;
}
for(int i=1;i<=n;i++)A[i][i]=A[i][n+1]=1;
guass();
dfs(n,0);
cout<<ans<<'\n';
}