By Jalan
知识工具需求
数学
- vertex cover(顶点覆盖)定义: 一个无向图G(V ,E)的vertex cover VC是顶点集V的一个子集,如果边uv∈ E,则顶点u,v至少有一个点属于VC。
数据结构和算法
- hash散列
语言
题干
vertex cover是一组顶点的集合,如果某边的任意一个顶点在顶点集合内,那么他在vertex cover内.
输入条件
第一行给N和M<=10^4,是顶点和边的总数
接下来是M行是边,顶点编号是0-N-1.
接下来给一个K<=100是提问数
接下来是K行每行首数字是顶点数,后面的是顶点.
输出条件
是在对应行打Yes,不是打No
题解
第一次
思路
用edge存下每个边
用一个hashlist存询问的顶点
检测每个边,如果两条边都没有出现在hashlist那么打印No进下一次询问
如果所有边都出现了打印Yes进下一次询问
预期时间复杂度
nk
编写用时
40分钟(写错了2次)
代码
CPP
#include <stdio.h>
#include<vector>
using namespace std;
typedef struct node{
int a;
int b;
}node;
int main(int argc, char const *argv[])
{
int N,M;
scanf("%d%d",&N,&M);
int temp1, temp2;
vector<node> edge;
edge.resize(10001);
for (int i = 0; i < M; i++)
{
scanf("%d%d",&temp1,&temp2);
edge[i].a=temp1;
edge[i].b=temp2;
}
int K;
scanf("%d",&K);
for (int i = 0; i < K; i++)
{
int *hashList = new int[10001]{0};
int vertexNumber;
scanf("%d",&vertexNumber);
for (int j = 0; j < vertexNumber; j++)
{
int temp;
scanf("%d",&temp);
hashList[temp]++;
}
int breaksign=0;
for (int l = 0; l < M; l++)
{
if (hashList[edge[l].a]!=0||hashList[edge[l].b]!=0)
{
continue;
}else
{
printf("No\n");
breaksign=1;
break;
}
}
if (!breaksign)
{
printf("Yes\n");
}
}
return 0;
}
运行用时
结尾
看在我写了这么多注释的份上可以给我点个赞嘛,求求惹=]砰砰砰,给我加点写下去的油呀@.@