第十四个样例点WA了QAQ
特在此求助巨佬
TAT答案明明是8偏偏输出10
P.S. 程序中的out是输出矩阵的:(
#include<bits/stdc++.h>
using namespace std;
const int N = 40,M = 600;
unsigned long long a[N],b[N];
bool f[N];
int n,m,x,y,ans;
void out(int l,int r,bool b)
{
for(int i = l;i <= r;i++)
{
if(b || a[i] != 0)
{
for(int j = n;j >= 1;j--)
cout<<(a[i]>>j&1)<<' ';
cout<<"| "<<(a[i]&1)<<endl;
}
}
cout<<endl;
}
void dfs(int X,int num)
{
if(num >= ans) return;
if(X == 0){ans = num;return;}
if(a[X]>>(n-X+1)&1)
{
bool v = a[X]&1;
for(int i = X+1;i <= n;i++)
if(a[x]>>(n-i+1)&1)
v ^= f[i];
dfs(X-1,num+v);
}
else
{
dfs(X-1,num);
f[X] = 1;
dfs(X-1,num+1);
f[X] = 0;
}
}
int main()
{
cin>>n>>m;
for(int i = 1;i <= n;i++) a[i] = pow(2,i)+1;
for(int i = 1;i <= m;i++)
{
cin>>x>>y;
a[x] |= 1<<y;
a[y] |= 1<<x;
}
for(int i = 1;i <= n;i++)
{
for(int j = i+1;j <= n;j++)
if(a[j] > a[i]) swap(a[i],a[j]);
if(a[i] == 0)
{
for(int j = 1;j <= n;j++)
for(int k = n;k >= 1;k--)
if(a[j]>>k&1){b[n-k+1] = a[j];break;}
for(int j = 1;j <= n;j++)
a[j] = b[j];
ans = 999999999;
dfs(n,0);
cout<<ans;
return 0;
}
for(int k = n;k;k--)
if(a[i]>>k&1)
{
for(int j = 1;j <= n;j++)
if((i != j) && (a[j]>>k&1)) a[j] ^= a[i];
break;
}
}
for(int i = 1;i <= n;i++) ans += a[i]&1;
cout<<ans;
return 0;
}