请求传奇耐卡王 (T 2点)
查看原帖
请求传奇耐卡王 (T 2点)
819516
liusir146楼主2024/11/21 18:26
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int head[N],tot,n,k,t,s[N],tt,cnt,sz[N],m,minn=1e9,step,a[N];
queue<int> q1,q2;
map<int,int> vis1,vis2;
inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-'){
			f=-1;
		}
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}
void bfs(int s,int t){
	q1.push(s);
	q2.push(t);
	vis1[s]=1;
	vis2[t]=1;
	while(!q1.empty()&&!q2.empty()){
		if(q1.size()<=q2.size()){
			int bq=q1.size();
			while(bq--){
				int h=q1.front();
				q1.pop();
				for(int i=0;i<30;i++){
					int v=h^a[i];
					if(vis2.find(v)!=vis2.end()){
						step++;
						return ;
					}
					if(vis1.find(v)==vis1.end()){
						vis1[v]=1;
						q1.push(v);
					}
				}	
			}
		}else {
			int bq=q2.size();
			while(bq--){
				int h=q2.front();
				q2.pop();
				for(int i=0;i<30;i++){
					int v=h^a[i];
					if(vis1.find(v)!=vis1.end()){
						step++;
						return ;
					}
					if(vis2.find(v)==vis2.end()){
						vis2[v]=1;
						q2.push(v);	
					}
				}
			}
		
		}
		step++;
	}
}
int main(){
	cin>>n>>m;
	for(int i=0;i<n;i++){
		a[i]=1LL<<i;
	}
	for(int i=1;i<=m;i++){
		int u,v;
		u=read(),v=read();
		u--,v--;
		a[u]|=1LL<<v;
		a[v]|=1LL<<u;
	}
	bfs(0,((1LL<<n)-1));
	cout<<step;
	return 0;
}
/*


*/
2024/11/21 18:26
加载中...