题目大意:
如果一个图的所有边的领接点至少有一个点在集合中,那么就称为这个集合为一个vertex cover,现给出一个图的顶点N和边数M,M条边的信息,和K次查询的集合元素,问当前集合是否是该图的一个vertex cover。
算法思路:
我们使用edges数组存储输入的M条边,每一次查询的时候就使用unordered_map<int,bool> vertices
记录输入的集合顶点为true,然后遍历每一条边,如果该边的2个领接点有一个不存在集合中,输出No,否则输出Yes。
提交结果:
AC代码:
#include<cstdio>
#include <unordered_map>
using namespace std;
struct Edge{
int a,b;
}edges[10005];
int main(){
int N,M;
scanf("%d %d",&N,&M);
for (int i = 0; i < M; ++i) {
int a,b;
scanf("%d %d",&a,&b);
edges[i].a = a;
edges[i].b = b;
}
int K;
scanf("%d",&K);
for (int j = 0; j < K; ++j) {
unordered_map<int,bool> vertices;
scanf("%d",&N);
for (int i = 0; i < N; ++i) {
int vertex;
scanf("%d",&vertex);
vertices[vertex] = true;
}
bool isCover = true;
for(int i=0;i<M;++i){
if(!vertices[edges[i].a]&&!vertices[edges[i].b]){
// 该边的2个顶点都没有出现在集合中
isCover = false;
break;
}
}
if(isCover){
printf("Yes\n");
} else {
printf("No\n");
}
}
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。