• 1134. Vertex Cover (25)


    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
    

     邻接表,每次记录与某个点有关的边的条数,然后标记这个点。最后判断是否是能有m条边就ok。

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    int first[80000],nex[80000],u[80000],v[80000];
    int n,m,k,nv,ve,visited[40001];
    int main()
    {
        memset(first,-1,sizeof(first));
        cin>>n>>m;
        for(int i = 0;i < m;i ++)
        {
            cin>>u[i]>>v[i];
            nex[i] = first[u[i]];
            first[u[i]] = i;
            u[i + m] = v[i];
            v[i + m] = u[i];
            nex[i + m] = first[u[i + m]];
            first[u[i + m]] = i + m;
        }
        cin>>k;
        while(k --)
        {
            int c = 0;
            cin>>nv;
            for(int i = 0;i < nv;i ++)
            {
                cin>>ve;
                visited[ve] = k;
                int ver = first[ve];
                while(ver != -1)
                {
                    if(visited[v[ver]] != k)
                    {
                        c ++;
                    }
                    ver = nex[ver];
                }
            }
            if(c == m)cout<<"Yes"<<endl;
            else cout<<"No"<<endl;
        }
    }
    View Code
  • 相关阅读:
    Dynamic导出解决方案修改其XML信息
    子网格
    官方文档
    ADFS登录页面自定义
    ADFS设置Tokn生命周期
    特征工程
    Pandas
    分类决策树
    Python基本知识
    机器学习的基本概念
  • 原文地址:https://www.cnblogs.com/8023spz/p/8569674.html
Copyright © 2020-2023  润新知