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'; }