非常特别一道题 注意学习其中运用hash的思想
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
int n,m,a,b,k,tempk,c;
cin>>n>>m;
int hash[m]={0};
vector<int> v[n];
for(int i=0;i<m;i++){
cin>>a>>b;
v[a].push_back(i);
v[b].push_back(i);
}
cin>>k;
for(int i=0;i<k;i++){
cin>>tempk;
int flag=0;
fill(hash,hash+m,0);
for(int j=0;j<tempk;j++){
cin>>c;
for(int q=0;q<v[c].size();q++){
hash[v[c][q]]=1;
}
}
for(int i=0;i<m;i++){
if(hash[i]==0){
printf("No\n");
flag=1;
break;//for循环输出完就要结束了注意加break(注意)
}
}
if(flag!=1) printf("Yes\n");
}
return 0;
}
总结
1.本题的思想是利用hash散列存储每个顶点对应的边边号我们自己赋值,给出query后直接遍历对应顶点的存储的边号,访问一条标记一条
最后遍历全部的边号看有没有没被标记的,有就不是,没有就是
2.注意for循环输出以后,就要break,不要出现循环输出的情况
3.设置局部flag,插入到其中一种情况之中,如果发生什么输出完毕后,flag值改变控制另一种情况的输出,类似于钥匙,本来是有钥匙的,发生一种后钥匙收走了,那个门自然也开不了了。
英语
问题 学习一下自主对边标号的情况