第十六天PAT-A1134 Vertex Cover简单模拟边的遍历

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值