一、题目概述
Vertex Cover为一个顶点集,满足图中任一条边都至少与Vertex Corver中的一个顶点邻接。
二、思路
建立边结构体edge{ v1, v2 },将所有边存储在数组中。
基于每个询问提供的顶点集, 遍历边数组。如果存在边邻接的两个定点都不在定点集中,则顶点集不是Vertex Corver。
三、代码
#include <cstdio>
#include <vector>
using namespace std;
int main()
{
int N, M, K;
scanf("%d %d", &N, &M);
vector<vector<int>> edge(M, vector<int>(2));
for(int i = 0; i < M; ++i)
scanf("%d %d", &edge[i][0], &edge[i][1]);
scanf("%d", &K);
for(int i = 0, flag, Nv; i < K; ++i)
{
scanf("%d", &Nv);
flag = 1;
vector<bool> cover(N, false);
for(int j = 0, v; j < Nv; ++j)
{
scanf("%d", &v);
cover[v] = true;
}
for(int j = 0; j < M && flag; ++j)
if(!cover[edge[j][0]] && !cover[edge[j][1]])
flag = 0;
printf("%s\n", flag ? "Yes":"No");
}
}