如果图中的一个顶点集合能够满足图中的每一条边都至少有一个端点在该集合内,那么这个顶点集合就是图的顶点覆盖。
现在给定一张图,以及若干个顶点集合,请你判断这些顶点集合是否是图的顶点覆盖。
输入格式
第一行包含两个整数 N 和 M,表示图中点和边的数量。接下来 M 行,每行包含两个整数 a,b,表示点 a 和点 b 之间存在一条边。
点编号 0∼N−1。
然后包含一个整数 K,表示询问的顶点集合数量。
接下来 K 行,每行描述一组询问顶点集合,格式如下:
Nv V[1] V[2] … V[Nv]
Nv 是集合中点的数量,V[i] 是点的编号。输出格式
每组询问输出一行结果,如果是顶点覆盖则输出 Yes,否则输出 No。数据范围
1≤N,M≤104,
1≤K≤100,
1≤Nv≤N
输入样例:
10 11
8 7
6 8
4 5
8 4
8 1
1 2
1 4
9 8
9 1
1 0
2 4
5
4 0 3 8 4
6 6 1 7 5 4 9
3 1 8 4
2 2 8
7 9 8 7 6 5 4 2
输出样例:
No
Yes
Yes
No
No
我的解法:
#include <bits/stdc++.h>
using namespace std;
const int N = 10010;
int n, m;
bool st[N];
struct Edge{
int a, b;
}E[N];
int main(){
cin >> n >> m;
for(int i = 0; i < m; i ++ ){
int a, b;
cin >> E[i].a >> E[i].b;
}
int k;
cin >> k;
while(k -- ){
int v;
cin >> v;
memset(st, 0 , sizeof st);
while(v -- ){
int node;
cin >> node;
st[node] = true;
}
int i;
for(i = 0; i < m; i ++ ){
if(st[E[i].a] == false && st[E[i].b] == false) break;
}
if(i == m) puts("Yes");
else puts("No");
}
return 0;
}
收获:
遇到简单的问题,可以使用结构体数组来存图