钉子精神
查看原帖
钉子精神
100325
peterwuyihong楼主2021/11/7 14:26

原来我的 limlim 设的 n/2n/2,然后在 n=35n=35 的时候输出了 \infty,但是我把它变成 n/2+1n/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;
}

2021/11/7 14:26
加载中...