题目

A vertex cover of a graph is a set of vertices such that each edge of the graph is incident to at least one vertex of the set. Now given a graph with several vertex sets, you are supposed to tell if each of them is a vertex cover or not.

Input Specification:

Each input file contains one test case. For each case, the first line gives two positive integers N and M (both no more than 104), being the total numbers of vertices and the edges, respectively. Then M lines follow, each describes an edge by giving the indices (from 0 to N-1) of the two ends of the edge. Afer the graph, a positive integer K (<= 100) is given, which is the number of queries. Then K lines of queries follow, each in the format:Nv v[1] v[2] … v[Nv] where Nv is the number of vertices in the set, and v[i]’s are the indices of the vertices.

Output Specification:

For each query, print in a line “Yes” if the set is a vertex cover, or “No” if not.

Sample Input:

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

Sample Output:

No

Yes

Yes

No

No

题目分析

给出图的每条边顶点信息,给出几组顶点集合,判断顶点集合是否是vertex cover(vertex cover指:一个顶点集合,图每条边的顶点至少有一个在这个顶点集合中)

解题思路

算法 1

  1. 定义顶点结构体edge,两个顶点left,right
  2. 定义vector v,存放图每条边的信息
  3. 定义int ves[N],存放每个查询顶点集合中顶点出现次数
  4. 每个顶点集合的判断,需要遍历所有边信息
    • 每条边的两个顶点至少有一个在顶点集合中,满足条件,打印Yes
    • 只要有一条边的两个顶点都不在顶点集合中,不满足条件,打印No

算法2

  1. 定义一个vector数组,数组下标表示顶点,vector中存放的是该顶点所在边的编号
  2. 每次校验一个顶点集合,定义一个int hash[M]数组,下标为图的边,值为边的顶点是否至少有一个在顶点集合中,若边满足条件置为1
  3. 遍历hash[M]数组,是否所有元素都为1,表示每条边至少有一个顶点在顶点集合中,该顶点集合是vertex cover

Code

Code 01(算法1 最优)

#include <iostream>
#include <vector>
using namespace std;
struct edge {
int left,right;
};
int main(int argc,char * argv[]) {
int N,M,K,L,V;
scanf("%d %d", &N,&M);
edge es[M];
for(int i=0; i<M; i++) {
scanf("%d %d",&es[i].left,&es[i].right);
}
scanf("%d",&K);
for(int i=0; i<K; i++) {
scanf("%d", &L);
int ves[N]= {0};
for(int j=0; j<L; j++) {
scanf("%d",&V);
ves[V]++;
}
int j;
for(j=0; j<M; j++) {
if(ves[es[j].left]==0&&ves[es[j].right]==0)break;
}
if(j!=M)printf("No\n");
else printf("Yes\n");
} return 0;
}

Code 02(算法2)

#include <iostream>
#include <vector>
using namespace std;
int main(int argc,char * argv[]) {
int N,M,K,L,V;
scanf("%d %d", &N,&M);
vector<int> es[N];
int f,r;
for(int i=0; i<M; i++) {
scanf("%d %d",&f,&r);
es[f].push_back(i);
es[r].push_back(i);
}
scanf("%d",&K);
for(int i=0; i<K; i++) {
scanf("%d", &L);
int hash[M]= {0};
for(int j=0; j<L; j++) {
scanf("%d",&V);
for(int t=0; t<es[V].size(); t++) {
hash[es[V][t]]=1;
}
}
int j;
for(j=0; j<M; j++) {
if(hash[j]==0) {
break;
}
}
if(j!=M)printf("No\n");
else printf("Yes\n");
} return 0;
}

PAT Advanced 1134 Vertex Cover (25) [hash散列]的更多相关文章

  1. PAT Advanced 1048 Find Coins (25) [Hash散列]

    题目 Eva loves to collect coins from all over the universe, including some other planets like Mars. On ...

  2. PAT Advanced 1084 Broken Keyboard (20) [Hash散列]

    题目 On a broken keyboard, some of the keys are worn out. So when you type some sentences, the charact ...

  3. PAT Advanced 1050 String Subtraction (20) [Hash散列]

    题目 Given two strings S1 and S2, S = S1 – S2 is defined to be the remaining string afer taking all th ...

  4. PAT Advanced 1041 Be Unique (20) [Hash散列]

    题目 Being unique is so important to people on Mars that even their lottery is designed in a unique wa ...

  5. PAT甲级——1134 Vertex Cover (25 分)

    1134 Vertex Cover (考察散列查找,比较水~) 我先在CSDN上发布的该文章,排版稍好https://blog.csdn.net/weixin_44385565/article/det ...

  6. PAT 甲级 1134 Vertex Cover

    https://pintia.cn/problem-sets/994805342720868352/problems/994805346428633088 A vertex cover of a gr ...

  7. 1134. Vertex Cover (25)

    A vertex cover of a graph is a set of vertices such that each edge of the graph is incident to at le ...

  8. PAT Advanced 1154 Vertex Coloring (25) [set,hash]

    题目 A proper vertex coloring is a labeling of the graph's vertices with colors such that no two verti ...

  9. PAT甲题题解-1078. Hashing (25)-hash散列

    二次方探测解决冲突一开始理解错了,难怪一直WA.先寻找key%TSize的index处,如果冲突,那么依此寻找(key+j*j)%TSize的位置,j=1~TSize-1如果都没有空位,则输出'-' ...

随机推荐

  1. 在各浏览器和各分辨率下如何让div内的table垂直水平居中?

    本文主要针对需要全屏显示的系统页面内,因为系统经常会用到表格table布局,偶尔的table需要显示在div的正中间,所以鄙人特此总结下div内table的万千姿态. <!DOCTYPE htm ...

  2. MESI缓存一致性协议

    整理一下一些计算机的基础概念. 概念 MESI(Modified, Exclusive, Shared, Invalid) 也称 Illinois 协议, 由美帝UIUC(University of ...

  3. 【数据结构】C++语言无锁环形队列的实现

    无锁环形队列 1.Ring_Queue在payload前加入一个头,来表示当前节点的状态 2.当前节点的状态包括可以读.可以写.正在读.正在写 3.当读完成后将节点状态改为可以写,当写完成后将节点状态 ...

  4. 快速搭建单机版Spring Cloud EurekaServer

    原文链接:http://www.yiidian.com/springcloud/build-eureka-single.html 本文介绍搭建单机版的Eureka Server服务 1 创建项目,导入 ...

  5. bzoj 3732Network

    先搞个最小生成树,然后lca(和之前的一个cf题差不多2333, 纯属颓废了..) 顺便思考了一下正确性. 因为所求的是所有路径中最大边的最小值.而kruskal每次往里添加的就是最小边.所以在生成树 ...

  6. 安装双系统(win8+ubuntu16)

    一.参考网址 1.windows10安装ubuntu双系统教程(绝对史上最详细) 2.安装Windows+Ubuntu双系统 二.注意细节 1.怎么看自己电脑是MBR还是UEFI:win+r输入msi ...

  7. Python操作APP -- Appium-Python-Client

    Appium连接模拟器 pip install Appium-Python-Client 使用Appium定位或者使用辅助定位工具 SDK安装目录/tools/bin,双击此辅助定位工具 from a ...

  8. Vue.js(19)之 封装calendar组件

    效果 需求 1.实现一个日历组件,如图: 2.显示某天的事项: 3.事项是模拟父组件请求接口返回的,数据格式如下: [ { id: '232', date: '2019-06-01', info: ' ...

  9. Android进阶——学习AccessibilityService实现微信抢红包插件

    在你的手机更多设置或者高级设置中,我们会发现有个无障碍的功能,很多人不知道这个功能具体是干嘛的,其实这个功能是为了增强用户界面以帮助残障人士,或者可能暂时无法与设备充分交互的人们 它的具体实现是通过A ...

  10. Unity 可重复随机数

    出处 https://blogs.unity3d.com/cn/2015/01/07/a-primer-on-repeatable-random-numbers/   (英文原版) http://ww ...