• PAT Advanced 1122 Hamiltonian Cycle (25)


    题目

    The “Hamilton cycle problem” is to find a simple cycle that contains every vertex in a graph. Such a cycle is called a “Hamiltonian cycle”. In this problem, you are supposed to tell if a given cycle is a Hamiltonian cycle.
    Input Specification:
    Each input file contains one test case. For each case, the first line contains 2 positive integers N (2< N <=200), the number of vertices, and M, the number of edges in an undirected graph. Then M lines follow, each describes an edge in the format “Vertex1 Vertex2”, where the vertices are numbered from 1 to N. The next line gives a positive integer K which is the number of queries, followed by K lines of queries, each in the format:
    n V1 V2 … Vn
    where n is the number of vertices in the list, and Vi‘s are the vertices on a path.
    Output Specification:
    For each query, print in a line “YES” if the path does form a Hamiltonian cycle, or “NO” if not.
    Sample Input:
    6 10
    6 2
    3 4
    1 5
    2 5
    3 1
    4 1
    1 6
    6 3
    1 2
    4 5
    6
    7 5 1 4 3 6 2 5
    6 5 1 4 3 6 2
    9 6 2 1 6 3 4 5 2 6
    4 1 2 5 1
    7 6 1 3 4 5 2 6
    7 6 1 2 5 4 3 1
    Sample Output:
    YES
    NO
    NO
    NO
    YES
    NO

    题意

    已知图,提供多条路径,求证路径是否为哈密尔顿环(一条包含图中所有顶点的环)

    题目分析

    路径是哈密尔顿环条件:

    1. 路径首尾相等
    2. 路径除了首尾相等,没有其他重复顶点
    3. 路径顶点数=图顶点数+1(加1是因为首尾相等)

    解题思路

    Code

    #include <iostream>
    #include <vector>
    #include <set>
    using namespace std;
    const int maxn=220;
    int n,m,e[maxn][maxn];
    int main(int argc,char * argv[]) {
    	scanf("%d %d",&n,&m);
    	int a=0,b=0;
    	for(int i=0; i<m; i++) {
    		scanf("%d %d",&a,&b);
    		e[a][b]=e[b][a]=1;
    	}
    	int k,q;
    	scanf("%d",&k);
    	for(int i=0; i<k; i++) {
    		scanf("%d",&q);
    		vector<int> v(q);
    		set<int> s;
    		bool flag1=true,flag2=true;
    		for(int j=0; j<q; j++) {
    			scanf("%d",&v[j]);
    			s.insert(v[j]);
    		}
    		if(s.size()!=n||q-1!=n||v[q-1]!=v[0]) flag1=false;
    		for(int j=0;j<v.size()-1;j++){
    			if(e[v[j]][v[j+1]]==0)flag2=false;
    		}
    		printf("%s",flag1&&flag2?"YES
    ":"NO
    ");
    	}
    	return 0;
    }
    
  • 相关阅读:
    day26
    day 25
    java.io.IOException: java.net.ConnectException: Call From master/192.168.58.128 to master:10020 failed on connection exception: java.net.ConnectException: 拒绝连接;
    疫情可视化系统
    使用eclipse创建spring cloud的eureka客户端和eureka服务端
    连接虚拟机的hive时进程自动杀死
    在Ubuntu18.04的Docker中安装Oracle镜像及简单使用
    Ubuntu16.04 上Docker 中安装SQL Server 2017
    docker
    Docker镜像报错
  • 原文地址:https://www.cnblogs.com/houzm/p/12380126.html
Copyright © 2020-2023  润新知