L2-1 分而治之
思路
这题的意思是,如果把这些点打掉,其他的点是否能够完全不连通。
用并查集,或者打上标记之后,判断每个点是否还能到达其他点,如果一个点可以到达其他任何点,都应该输出否。
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e4+10;
int x[maxn],y[maxn],pre[maxn];
void init(int n) {
for (int i=1;i<=n;i++) {
pre[i]=i;
}
}
int getBlock(int n){
int res=0;
for (int i=1;i<=n;i++) {
if (pre[i]==i) {
res++;
}
}
return res;
}
inline int find(int x) {
if (pre[x]==x) {
return x;
}
return pre[x]=find(pre[x]);
}
void unions(int x,int y) {
int fx=find(x);
int fy=find(y);
if (fx!=fy) {
pre[fx]=fy;
}
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for (int i=0;i<m;i++) {
scanf("%d%d",&x[i],&y[i]);
}
int k,p,tmp;
scanf("%d",&k);
while (k--) {
unordered_map<int,int> cache;
scanf("%d",&p);
while (p--) {
scanf("%d",&tmp);
cache[tmp]=1;
}
init(n);
for (int i=0;i<n;i++) {
if (!(cache[x[i]]||cache[y[i]])) {
unions(x[i],y[i]);
}
}
int ans=getBlock(n);
if (ans==n) {
printf("YES\n");
}
else {
printf("NO\n");
}
}
return 0;
}