zoukankan      html  css  js  c++  java
  • PAT 甲级 1134 Vertex Cover

    https://pintia.cn/problem-sets/994805342720868352/problems/994805346428633088

    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 1), 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 N1) of the two ends of the edge.

    After 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​​ [

    where Nv​​ is the number of vertices in the set, and ['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

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    
    const int maxn = 1e5 + 10;
    
    
    int N, M, T, K;
    int x, vis[maxn];
    
    vector<int> v[maxn];
    bool flag = false;
    int step = 0;
    
    int main() {
        scanf("%d%d", &N, &M);
        for(int i = 0; i < M; i ++) {
            int st, en;
            scanf("%d%d", &st, &en);
    
            v[st].push_back(i);
            v[en].push_back(i);
        }
        scanf("%d", &T);
        while(T --) {
            step = 0;
            memset(vis, 0, sizeof(vis));
            scanf("%d", &K);
            for(int i = 0; i < K; i ++){
                scanf("%d", &x);
    
                for(int j = 0; j < v[x].size(); j ++) {
                    if(vis[v[x][j]] == 0) {
                        vis[v[x][j]] = 1;
                        step ++;
                    }
                }
    
            }
    
            if(step == M) printf("Yes
    ");
            else printf("No
    ");
        }
        return 0;
    }
    

      标记边被覆盖的数量 判断数目是否符合 行吧 理解错题意可还行

  • 相关阅读:
    DS博客作业04--图
    DS博客作业03--树
    DS博客作业02--栈和队列
    DS博客作业01--线性表
    C博客作业05--指针
    C语言博客作业04--数组
    C博客作业03--函数
    博客作业——循环结构
    C博客作业05-指针
    C博客作业04--数组
  • 原文地址:https://www.cnblogs.com/zlrrrr/p/10415576.html
Copyright © 2011-2022 走看看