A1134
Description:
给一个图,和一组已覆盖的节点,求该覆盖是否涵盖了所有边的至少一个点;
思路:
- 用e数组存下每条边的两个端点,mp数组用于表示每个点是否被涵盖;
- 顺序遍历数组每条边,如果存在两端点均未被覆盖的边,则输出No,反之输出Yes;
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
using namespace std;
const int maxn = 1e4+5;
int n, m;
int e[maxn][2]; //用于保存边的两端点信息,注意双向边总个数应为题目中maxm的两倍
bool mp[maxn];
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif // ONLINE_JUDGE
scanf("%d%d", &n, &m);
//读取无向边
for(int i = 0; i < m; i++) scanf("%d%d", &e[i][0], &e[i][1]);
int k, nodcnt, u;
scanf("%d", &k);
for(int i = 0; i < k; i++){
memset(mp, true, sizeof(mp)); //初始化
scanf("%d", &nodcnt);
for(int j = 0; j < nodcnt; j++){ //读取图中的节点
scanf("%d", &u);
mp[u] = false; //标记该节点已被覆盖
}
int j;
for(j = 0; j < m; j++){ //遍历所有边
if(mp[e[j][0]]==true&&mp[e[j][1]]==true){ //若存在两节点均未被覆盖
printf("No\n");
break;
}
}
if(j >= m) printf("Yes\n");
}
return 0;
}