题意
给出一个图和一组顶点序列,对这组序列逐个判断是否满足图的任一条边至少有一个顶点在序列中。
分析
思路一
对某一个序列而言,判断是否满足条件,可以通过双重循环遍历每一条边的顶点是否至少有一个包含在序列中。但本题数据规模是10^4,双重循环会导致超时,因此考虑采用find()函数判断是否可以在序列中查询到至少一个顶点。故选用set存储序列,遍历所有的边,判断其顶点是否可在set中被查询。
思路二
对边进行标号,使用二维数组存储每个顶点对应的所有边。遍历序列中的每一个元素,将当前元素对应的边的hash[i]置为1。遍历hash数组,如果数组中每一个元素对应的值都为1,则输出Yes;否则输出No。
详见柳婼代码
代码
#include <bits/stdc++.h>
using namespace std;
struct node{
int a,b;
};
int main()
{
int n,m,a,b,k;
scanf("%d %d",&n,&m);
vector<node> e(m);
for(int i=0;i<m;i++) scanf("%d %d",&e[i].a,&e[i].b);
scanf("%d",&k);
while(k--){
int nv,v;
bool flag=true;
scanf("%d",&nv);
set<int> s;
for(int i=0;i<nv;i++){
scanf("%d",&v);
s.insert(v);
}
for(int i=0;i<m;i++){
if(s.find(e[i].a)==s.end()&&s.find(e[i].b)==s.end()){
flag=false;
break;
}
}
if(!flag) printf("No\n");
else printf("Yes\n");
}
}