• PAT (Advanced Level) Practice 1134 Vertex Cover (25分) (存边+标记点!!)


    1.题目

    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 10​4​​), 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:

    N​v​​ v[1] v[2]⋯v[N​v​​]

    where N​v​​ 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

    2.题目分析

    将图中的所有边用struct记录,将待测试的点的大小用vector标记, 之后遍历图的边,如果边的两个点在vector中都未标记,则说明没有覆盖

    3.代码

    #include<iostream>
    #include<vector>
    using namespace std;
    struct node
    { 
    	int s, e;
    };
    vector<node>list;
    int main()
    {
    	int n, m, a, b, k, count;
    	scanf("%d %d", &n, &m);
    	for (int i = 0; i < m; i++)
    	{
    		scanf("%d %d", &a, &b);
    		list.push_back({ a,b });
    	}
    	scanf("%d", &k);
    	for (int i = 0; i < k; i++)
    	{
    		bool ok = true;
    		vector<int>mark;
    		mark.resize(m);
    		scanf("%d", &count);
    		for (int j = 0; j < count; j++)
    		{
    			scanf("%d", &a);
    			mark[a] = 1;
    		}
    		for (int s = 0; s < m; s++)
    			if (mark[list[s].e] == 0 && mark[list[s].s] == 0) { ok = false; break; }
    		if (ok)printf("Yes
    ");
    		else printf("No
    ");
    	}
    
    }
  • 相关阅读:
    LNK2001: unresolved external symbol ... virtual ...
    pygments
    cygwin Mingw
    [转]__attribute__((format (printf, 2, 3))
    [转] C和C++混合编程
    [转]网络包的流转
    [转]程序是如何运行起来的
    [转]Makefile中 .PHONY的作用
    [转]makefile学习
    [转] makefile 中 = := ?= += 区别
  • 原文地址:https://www.cnblogs.com/Jason66661010/p/12788872.html
Copyright © 2020-2023  润新知