• 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
    
    哈密顿圈 所有点只经过一次的回路。
    代码:
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    int mp[201][201];
    int n,m,a,b,c,v[201],k;
    int main()
    {
        cin>>n>>m;
        for(int i = 0;i < m;i ++)
        {
            cin>>a>>b;
            mp[a][b] = mp[b][a] = 1;
        }
        cin>>m;
        for(int i = 0;i < m;i ++)
        {
            cin>>k;
            int flag = 1;
            if(k != n + 1)flag = 0;
            cin>>a;
            c = a;
            memset(v,0,sizeof(v));
            v[a] ++;
            for(int j = 1;j < k;j ++)
            {
                cin>>b;
                if(!mp[a][b])flag = 0;
                v[b] ++;
                if(v[b] == 2 && b != c || v[b] > 2)flag = 0;
                a = b;
            }
            if(b != c)flag = 0;
            if(flag)cout<<"YES"<<endl;
            else cout<<"NO"<<endl;
        }
    }
  • 相关阅读:
    八数码难题 (codevs 1225)题解
    小木棍 (codevs 3498)题解
    sliding windows (poj 2823) 题解
    集合删数 (vijos 1545) 题解
    合并果子 (codevs 1063) 题解
    等价表达式 (codevs 1107)题解
    生理周期 (poj 1006) 题解
    区间 (vijos 1439) 题解
    区间覆盖问题 题解
    种树 (codevs 1653) 题解
  • 原文地址:https://www.cnblogs.com/8023spz/p/8493045.html
Copyright © 2020-2023  润新知