zoukankan      html  css  js  c++  java
  • PAT A1122 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<N200), 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:

    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 #include <stdio.h>
     2 #include <algorithm>
     3 #include <iostream>
     4 #include <map>
     5 #include <vector>
     6 #include <set>
     7 using namespace std;
     8 int n,m,k;
     9 int dis[201][201];
    10 int path[1000],vis[201];
    11 int main(){
    12     scanf("%d %d",&n,&m);
    13     for(int i=0;i<m;i++){
    14         int c1,c2;
    15         scanf("%d %d",&c1,&c2);
    16         dis[c1][c2]=1;
    17         dis[c2][c1]=1;
    18     }
    19     scanf("%d",&k);
    20     int min=99999999,mini=0;
    21     for(int i=1;i<=k;i++){
    22         int flag=0;
    23         int total=0;
    24         int nn;
    25         fill(vis,vis+201,0);
    26         scanf("%d",&nn);
    27         for(int j=0;j<nn;j++){
    28              scanf("%d",&path[j]);
    29              vis[path[j]]++;
    30         }
    31         for(int j=1;j<=n;j++){
    32              if(vis[j]==0) flag=1;
    33         }
    34         if(nn!=n+1 || path[0]!=path[nn-1]) flag=1;
    35         for(int j=1;j<nn;j++){
    36               if(dis[path[j]][path[j-1]]==0){
    37                   flag=1;
    38                   break;
    39             }
    40           }
    41           if(flag==1) printf("NO
    ");
    42           else{
    43               printf("YES
    ");
    44         }
    45     }
    46 }
    View Code

    注意点:挺简单的一道题,就按题目意思实现一下,判断给的路径是否是一个环,这个环有没有包含所有节点,并且是联通的,点除了起点都只经过一次。和1150 Travelling Salesman Problem (25 分)差不多,比他更简单一些

    ---------------- 坚持每天学习一点点
  • 相关阅读:
    ElasticSearch 清理索引
    Docker 服务接入SkyWalking
    Promethues mysql_exporter 集中式监控
    修改SVN密码自助平台
    快速排序(golang)
    ElasticSearch Xpack集群认证和elasticsearch-head配置
    Ansible一个tasks失败则终止剩余的task
    Consul安装
    最纯净的开发者技术交流社群
    Flutter中的报错:(IOS pod 版本错误) error: compiling for iOS 8.0, but module 'xxx' has a minimum deployment target of iOS 9.0
  • 原文地址:https://www.cnblogs.com/tccbj/p/10435149.html
Copyright © 2011-2022 走看看