#include<iostream> #include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> #include<algorithm> #include<map> #include<vector> #include<queue> using namespace std; /*hash思想:a(num)到i点组成的t号边=v[num][t],即v[num][t]号边 注意t号边指该点的第几条边,v[num][t]号边为总边号,遍历时以他为下标的hash数组元素赋1*/ //法2:用set,s.insert(v[num][t]),打印时就判断s.size()为m则YES int main(){ int n,m,k,nv,a,b,num; scanf("%d%d",&n,&m);//n点m边 //vector<int> v[n]; //我的vs在n飙红。。 vector<vector<int>> v(n); for(int i=0;i<m;i++){ scanf("%d%d",&a,&b); v[a].push_back(i); v[b].push_back(i); } scanf("%d",&k);//k次查询 for(int i=0;i<k;i++){ scanf("%d",&nv);//点集合的点数 int flag=0; vector<int> hash(m,0); for(int j=0;j<nv;j++){ scanf("%d",&num);//点集合的点编号 for(int t=0;t<v[num].size();t++) //遍历num点的所有边 hash[ v[num][t] ]=1; //v[num][t]为num点所在的t号边的编号 //法2:s.insert(v[num][t])下面判断打印的if:s.size()==m则YES } for(int j=0;j<m;j++){ if(hash[j]==0){ printf("No\n"); flag=1; break; } } if(flag==0) printf("Yes\n");//flag细节 } system("pause"); return 0; }