思路:
这题和L2-013红色警报那题很像,那题是用并查集做的,所以这题一开始我也用的并查集,但是过了之后发现用并查集多此一举了。是因为这题不用统计孤立点的个数,只要判断是不是全孤立就好了,所以用不到并查集。
大致思路就是把输入给出的边记录下来,我们之后处理每次询问都要用。处理询问时,给攻打的城市做上标记,然后再遍历我们记录下来的边,只要有一对边A-B,其中A、B都没有在攻打计划中,那么这个方案就不可行,必须所有边都至少有一个城市在攻打计划中。因为如果两个联通的城市都不在攻打计划中,那么这俩城市还是联通的,就不能让所有城市孤立了。
代码:
#include<iostream>
#include<cstdio>
using namespace std;
int date[10010][2];
int n,m,a,b,k,np;
bool book[10010];
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++) cin>>date[i][0]>>date[i][1];
cin>>k;
while(k--){
cin>>np;
int temp;
for(int i=1;i<=np;i++){
cin>>temp;
book[temp]=true;
}
int st=true;
for(int i=1;i<=m;i++){
a=date[i][0],b=date[i][1];
if(!book[a]&&!book[b]) st=false;
}
if(st) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
for(int i=1;i<=n;i++) book[i]=false;
}
system("pause");
}