单纯模拟会超时
把问题变换一下
把要摧毁的城市的vis都标记为1
如果路的两端的城市都没被摧毁,则不符合题中的剩下的所以城市都孤立无援
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e4+6;
int f[maxn];
int n,m;
int vis[maxn];
int find(int x)
{
while(x!=f[x])
x=f[x];
return x;
}
void uni(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx<fy)
f[fy]=fx;
else
f[fx]=fy;
}
typedef pair<int,int> PII;
vector<PII> ve;
void init()
{
for(int i=1;i<=n;i++)
f[i]=i;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
ve.push_back({x,y});
}
int k;
scanf("%d",&k);
while(k--)
{
int p;
scanf("%d",&p);
init();
memset(vis,0,sizeof(vis));
while(p--)
{
int x;
scanf("%d",&x);
vis[x]=1;
}
int f=0;
for(int j=0;j<ve.size();j++)
{
if(vis[ve[j].first]==0&&vis[ve[j].second]==0)
f=1;
}
if(f==0)
printf("YES\n");
else
printf("NO\n");
}
}