题意
vertex cover要满足的是——图中的每一条边至少依附于点集中的一个点。判断给出的点集是否为vertex cover
思路
- 对点集枚举所有的边,只要找到一条边不满足,我们就可以提前退出,判断这个点集不是vertex cover
代码
#include <iostream>
#include <algorithm>
#include <unordered_map>
#include <vector>
#include <cmath>
using namespace std;
struct edge {
int u, v;
};
int main() {
int N, M, K, nv;
scanf("%d %d", &N, &M);
int u, v;
vector<edge> edge_table; // 边表
for(int i = 0; i < M; i++) {
scanf("%d %d", &u, &v);
edge_table.emplace_back(edge{u, v});
}
scanf("%d", &K);
int t;
while(K--) {
scanf("%d", &nv);
unordered_map<int, int> mp;
for(int i = 0; i < nv; i++) {
scanf("%d", &t);
mp[t] = 1;
}
bool qualified = true;
for(auto e: edge_table) {
// 找到一条边,没有一个点在点集里就判定不合格
if(mp[e.u] == 0 && mp[e.v] == 0) {
qualified = false;
break;
}
}
if(qualified)
printf("Yes
");
else
printf("No
");
}
return 0;
}