思路:计算一下除去Np个点之后的连通分量,如果去掉的点数+此时的连通分量==n,就输出YES,否则输出NO。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <sstream>
#include <ctime>
#define lowbit(x) ((~x+1)&x)
#define inf 0x3f3f3f3f
using namespace std;
const int N = 1e5+10;
vector<int>g[10005];
int vis[10005],book[10005];
int n,m,k,p;
void dfs(int u) {
for(int i=0; i<g[u].size(); i++) {
int v=g[u][i];
if(!vis[v]&&!book[v]) {
vis[v]=1;
dfs(v);
}
}
}
int main() {
cin>>n>>m;
for(int i=1; i<=m; i++) {
int u,v;
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
cin>>k;
while(k--) {
int t,u,cnt=0;
cin>>t;
memset(vis,0,sizeof(vis));
memset(book,0,sizeof(book));
for(int i=1; i<=t; i++) {
int tmp;
cin>>tmp;
book[tmp]=1;
}
for(int i=1; i<=n; i++) {
if(!vis[i]&&!book[i]) {
cnt++;
vis[i]=1;
dfs(i);
}
}
if(cnt+t==n) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}