zoukankan      html  css  js  c++  java
  • PAT1134:Vertex Cover

    1134. Vertex Cover (25)

    时间限制
    600 ms
    内存限制
    65536 kB
    代码长度限制
    16000 B
    判题程序
    Standard
    作者
    CHEN, Yue

    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.

    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 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
    

    思路

    判断一个集合的点是否覆盖了所有的边。

    1.用vector保存所有的边(包含起止点)

    2.将需要查询的点插入set容器中。

    3.对于每一条边,检查它的起止点是否有至少一个点在集合中。如果有Yes,如果没有No。

    代码

    #include<iostream>
    #include<vector>
    #include<set>
    using namespace std;
    
    class edge
    {
    public:
        int a;
        int b;
    };
    
    int main()
    {
        int N,M;
        while(cin >> N >> M)
        {
            vector<edge> edges(M);
            for(int i = 0; i < M; i++)
            {
                cin >> edges[i].a >>edges[i].b;
            }
            int K;
            cin >> K;
            for(int i = 0; i < K; i++)
            {
                int Nv;
                cin >> Nv;
                set<int> nodes;
                for(int j = 0; j < Nv; j++)
                {
                    int node;
                    cin >> node;
                    nodes.insert(node);
                }
                bool isCovered = true;
                for(int v = 0; v < M; v++)
                {
                    if(nodes.find(edges[v].a) == nodes.end() && nodes.find(edges[v].b) == nodes.end())
                    {
                        isCovered = false;
                        break;
                    }
                }
                if(isCovered)
                    cout << "Yes" << endl;
                else
                    cout << "No" << endl;
            }
        }
    }
    

      

  • 相关阅读:
    纯前端导出Excel表格
    vue 组件按需引用,vue-router懒加载,vue打包优化,加载动画
    解决图片循环展示间距
    微信小程序aes前后端加密解密交互
    判断字符串中是否包含表情
    银行卡号Luhn校验算法
    身份证校验(支持15位和18位身份证号)、邮箱校验正则
    数组去重
    bootstrap 中 css 与 javascript 的使用
    js 分页
  • 原文地址:https://www.cnblogs.com/0kk470/p/7754113.html
Copyright © 2011-2022 走看看