原来我的 lim 设的 n/2,然后在 n=35 的时候输出了 ∞,但是我把它变成 n/2+1,它就过了,这是为什么呢?
#include<bits/stdc++.h>
using namespace std;
int n,m,lim,x,y;
int head[36],Next[1200],ver[1200],tot;
void add(int x,int y){
ver[++tot]=y;
Next[tot]=head[x];
head[x]=tot;
}
map<vector<int>,int>M;
signed main(){
#ifndef ONLINE_JUDGE
freopen("testdata.in","r",stdin);
#endif
cin>>n>>m;
memset(head,-1,sizeof head);
while(m--){
cin>>x>>y;
add(--x,--y);add(y,x);
}
lim=n/2+1;
for(int i=0;i<1<<lim;i++){
vector<int>G(n);
for(int j=0;j<lim;j++)
if(i>>j&1){
G[j]^=1;
for(int k=head[j];~k;k=Next[k]){
int l=ver[k];
G[l]^=1;
}
}
if(!M.count(G))M[G]=__builtin_popcount(i);
else M[G]=min(M[G],__builtin_popcount(i));
}
int ans=INT_MAX;
for(int i=0;i<1<<(n-lim);i++){
vector<int>G(n,1);
for(int j=lim;j<n;j++)
if(i>>(j-lim)&1){
G[j]^=1;
for(int k=head[j];~k;k=Next[k]){
int l=ver[k];
G[l]^=1;
}
}
if(M[G])ans=min(ans,M[G]+__builtin_popcount(i));
}
cout<<ans;
}