“孤立无援”用一个degree数组来判断,当这个点入度为0时就是孤立无援的。
那么思路就是:首先用vector来存储与某顶点有通路的所有顶点(无向图),同时对应顶点degree++;
然后每次判断一个方案,degree数组要重用一次,所以数组temp
每次方案说一个顶点,将改顶点标记,将与该顶点有通路的所有顶点degree--,最后判断所有无标记顶点是否degree==0;
// 我们希望首先攻下敌方的部分城市,使其剩余的城市变成孤立无援,
#include<bits/stdc++.h>
using namespace std;
int degree[10010];
int temp[10010];
vector<int> v[10010];
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<m;i++){
int x,y;
cin>>x>>y;
degree[x]++;degree[y]++;
v[x].push_back(y);v[y].push_back(x);
}
int k;cin>>k;
for(int i=0;i<k;i++){
for(int j=1;j<=n;j++) temp[j]=degree[j];
int t;cin>>t;
vector<int> hash(n+1);
for(int j=0;j<t;j++){
int x;cin>>x;
hash[x]=1;
for(int p=0;p<v[x].size();p++) temp[v[x][p]]--;
}
bool flag=true;
for(int j=1;j<=n;j++){
if(hash[j]==0){
if(temp[j]!=0) flag=false;
}
}
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}