1134 Vertex Cover (25 分)

题目链接

题意

给出一个图和一组顶点序列,对这组序列逐个判断是否满足图的任一条边至少有一个顶点在序列中。

分析

思路一

对某一个序列而言,判断是否满足条件,可以通过双重循环遍历每一条边的顶点是否至少有一个包含在序列中。但本题数据规模是10^4,双重循环会导致超时,因此考虑采用find()函数判断是否可以在序列中查询到至少一个顶点。故选用set存储序列,遍历所有的边,判断其顶点是否可在set中被查询。

思路二

对边进行标号,使用二维数组存储每个顶点对应的所有边。遍历序列中的每一个元素,将当前元素对应的边的hash[i]置为1。遍历hash数组,如果数组中每一个元素对应的值都为1,则输出Yes;否则输出No。
详见柳婼代码

代码

#include <bits/stdc++.h>
using namespace std;
struct node{
    int a,b;
};
int main()
{
    int n,m,a,b,k;
    scanf("%d %d",&n,&m);
    vector<node> e(m);
    for(int i=0;i<m;i++) scanf("%d %d",&e[i].a,&e[i].b);
    scanf("%d",&k);
    while(k--){
        int nv,v;
        bool flag=true;
        scanf("%d",&nv);
        set<int> s;
        for(int i=0;i<nv;i++){
            scanf("%d",&v);
            s.insert(v);
        }
        for(int i=0;i<m;i++){
            if(s.find(e[i].a)==s.end()&&s.find(e[i].b)==s.end()){
                flag=false;
                break;
            }
        }
        if(!flag) printf("No\n");
        else printf("Yes\n");
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值