给定一个无向图,给定一些被占领的点,
要你判断最后这个图中所有的点是不是都被孤立。这个问题实际上可以转化,
我们将被占领的点标记上,tag[i] =1。
然后遍历所有未被占领的结点,
只要这个未被占领的结点周围的相邻结点全部都是被占领的,
那么它就是孤立无援的点。
(反面是 存在至少一个没被占领的相邻节点,那么该城市不孤立)
算法两重循环可以搞定,
用vector< int > G[maxn]邻接表存储图的关系,
效率比二维数组高,而且本题数据量10000较大,
用二维数组查找起来也不方便。/*
解题思路:邻接表保存城市连通关系,
book数组记录首先被攻打的城市,
最后判断未被攻打的城市中与之相连的城市是否被攻打,
若存在未被攻打的,那此方案不成立
*/
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int N = 10010;
int n,m;
vector<int> G[N];
int isD[N] = { false };
bool check() {
//遍历每个没有被占领的结点,看它的相邻(周围一圈)结点是不是都是被占领结点
for (int i = 1; i <= n; i++) {
if (isD[i] == false) {//每个没有被占领的结点
for (int j = 0; j < G[i].size(); j++) {
if (isD[G[i][j]] == false)
return false;
}
}
}
return true;
}
int main() {
cin >> n >> m;
for (int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
G[a].push_back(b);
G[b].push_back(a);
}
int q;
cin >> q;
for (int i = 0; i < q; i++) {
int k;
cin >> k;
memset(isD, false, sizeof(isD));
for (int j = 0; j < k; j++) {
int tmp;//这咋让我突然想到了红色警报,也需要一个数组来标注城市的被攻占情况
cin >> tmp;
isD[tmp] = true;
}
if (check())cout << "YES\n";
else cout << "NO\n";
}
}