题目

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. 七十八、SAP中数据库操作之查询条数限制

    一.UP TO <数量> ROWS,表示查询出多少条数据 二.效果如下

  2. Centos7安装rabbitMQ3.6.0

    文章中的erlang和rabbitmq3.6.0 http://pan.baidu.com/s/1c2Nn64w ​ Centos7 系统操作 cd /etc/yum.repos.d/ mv Cent ...

  3. vue路由 视图命名

    <body> <div id="app"> <p @click="go">hello app!</p> < ...

  4. c++ 配置ffmpeg

    本教程只针对windows64/32+vs2013环境配置第一步 :配环境1.打开ffmpeg官网中编译好的windows版本http://ffmpeg.zeranoe.com/builds/64位w ...

  5. SpringCloud学习之Sleuth服务链路跟踪(十二)

    一.为什么需要Spring Cloud Sleuth 微服务架构是一个分布式架构,它按业务划分服务单元,一个分布式系统往往有很多个服务单元.由于服务单元数量众多,业务的复杂性,如果出现了错误和异常,很 ...

  6. mysql日期

    查询当前时间 select now() 结果:2017-04-24 18:11:26 格式化当前日期 SELECT DATE_FORMAT(NOW(), '%Y-%m-%d') 结果:2017-04- ...

  7. Java IO 乱码

    InputStreamReader isr = new InputStreamReader(new FileInputStream("./test/垃圾短信训练集80W条.txt" ...

  8. jquery判断当前浏览器是否是IE

    if (window.ActiveXObject || "ActiveXObject" in window){ layer.msg("This page does not ...

  9. POJ 2528 Mayor‘s poster 线段树+离散化

    给一块最大为10^8单位宽的墙面,贴poster,每个poster都会给出数据 a,b,表示该poster将从第a单位占据到b单位,新贴的poster会覆盖旧的,最多有10^4张poster,求最后贴 ...

  10. 1.4CAD2017绘图基础

    1.新建(ctrl+n) 命令:new 回车——默认样板(acadiso.dwt) 2.打开(ctr+o) 3.保存(ctrl+S) 4.鼠标的应用: 左键:点击拖选等: 中间滚轮:a.滚动,放大缩小 ...