这个题比较鬼畜,我做这个题时,想着用并查集,就一直错,不用并查集
并查集
#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;
}