初尝并查集

这个题比较鬼畜,我做这个题时,想着用并查集,就一直错,不用并查集
并查集

#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<list>
#include<set>
#include<cmath>
using namespace std;
typedef long long ll;
#define N 205
int edge[N][N];
int main(){
	int n,m,x,y;
	cin >> n >> m;
	memset(edge,0,sizeof(edge));
	for(int i=0;i<m;i++){
		cin >> x >> y;
		edge[x][y] = 1;
		edge[y][x] = 1;
	}
	int t,vis[n+1];
	memset(vis,0,sizeof(vis));
	cin >> t;
	while(t--){
		int cnt,pre,flag=1,start;
		cin >> cnt;
		cin >> start; vis[start]=1;pre = start;
		
		for(int j=1;j<cnt;j++){
			cin >> x;
			if(!edge[pre][x]) flag = 0;
			// 判定条件要注意
			if(vis[x]&&(j<cnt-1||x!=start)) flag = 0;
//			if(vis[x]&&x!=start||!edge[pre][x]) flag = 0;
			vis[x]=1;
			pre = x;
		}
		if(cnt!=n+1) flag = 0;   //可以简化许多,需要通过所有的点
		if(flag) cout<< "YES" << endl;
		else cout << "NO" << endl;
		memset(vis,0,sizeof(vis));
	} 
	return 0;
}
发布了13 篇原创文章 · 获赞 1 · 访问量 138

猜你喜欢

转载自blog.csdn.net/safafs/article/details/105655880