PAT 1122 Hamiltonian Cycle[比较一般]

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 V?1?? V?2?? ... V?n??

where n is the number of vertices in the list, and V?i??‘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

题目大意:判断给出的路径是否是哈密顿回路,哈密顿回路是一个简单回路,包含图中的每一个点,

我的AC:

#include <iostream>
#include <vector>
#include<cstdio>
#include <map>
using namespace std;
#define inf 9999

int g[205][205];
int vis[205];
int main() {
    int n,m,f,t;
    cin>>n>>m;
    fill(g[0],g[0]+205*205,inf);
    for(int i=0;i<m;i++){
        cin>>f>>t;
        g[f][t]=1;
        g[t][f]=1;
    }
    int k,ct;
    cin>>k;
    while(k--){
        fill(vis,vis+205,0);
        cin>>ct;
        vector<int> path(ct);
        for(int i=0;i<ct;i++){
            cin>>path[i];
        }
        if(path[0]!=path[ct-1]){//首先需要保证两者是相同的。
            cout<<"NO\n";continue;
        }
        bool flag=false;
        for(int i=0;i<ct-1;i++){
           if(g[path[i]][path[i+1]]==inf){//如果两点之间,没有路径。
                cout<<"NO\n";
                flag=true;
                break;
           }
           if(vis[path[i+1]]==1){//如果重复访问那么就不是简单路径,
                cout<<"NO\n";
                flag=true;break;
           }
           vis[path[i+1]]=1;
          // cout<<path[i+1]<<‘\n‘;
        }
        if(!flag){//这里还需要判断是否是所有的点都已经访问过。
            bool fg=false;
            for(int i=1;i<=n;i++){//这里是从1开始判断啊喂!!!
                if(vis[i]==0){
                    cout<<"NO\n";
                    fg=true;break;
                }
            }
            if(!fg)cout<<"YES\n";
        }
    }
    return 0;
}

//本来很简单的一道题,两个周没打算法代码了,生疏了。

1.点标号是从1开始的所以 最后判断所有的点是否被遍历过,是从1开始循环的,

2.比较简单,就是几个判断情况,使用邻接矩阵存储图,不是邻接表。

原文地址:https://www.cnblogs.com/BlueBlueSea/p/9689706.html

时间: 2024-10-09 18:11:16

PAT 1122 Hamiltonian Cycle[比较一般]的相关文章

PAT 1122 Hamiltonian Cycle

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 Specif

1122 Hamiltonian Cycle (25 分)

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 H

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 Specif

hihoCoder #1087 Hamiltonian Cycle

Description Given a directed graph containing n vertice (numbered from 1 to n) and m edges. Can you tell us how many different Hamiltonian Cycles are there in this graph? A Hamiltonian Cycle is a cycle that starts from some vertex, visits each vertex

PAT 甲级真题题解(121-155)

1121 Damn Single 模拟 1 // 1121 Damn Single 2 #include <map> 3 #include <vector> 4 #include <cstdio> 5 #include <iostream> 6 #include <algorithm> 7 using namespace std; 8 9 map<int, int> m, vis; 10 vector<int> p; 11

A题目

1 1001 A+B Format(20) 2 1002 A+B for Polynomials(25) 3 1003 Emergency(25) 4 1004 Counting Leaves(30) 5 1005 Spell It Right(20) 6 1006 Sign In and Sign Out(25) 7 1007 Maximum Subsequence Sum(25) 8 1008 Elevator(20) 9 1009 Product of Polynomials(25) 10

计算机算法常用术语中英对照(分为两部分 其中一部分表格形式 )

第一部分 Data Structures 基本数据结构 Dictionaries 字典 Priority Queues 堆 Graph Data Structures 图 Set Data Structures 集合 Kd-Trees 线段树 Numerical Problems 数值问题 Solving Linear Equations 线性方程组 Bandwidth Reduction 带宽压缩 Matrix Multiplication 矩阵乘法 Determinants and Perm

算法设计与分析 - 李春葆 - 第二版 - pdf-&gt;word v3

1 1.1 第1章─概论 2 3 1.1.1 练习题 4 1. 下列关于算法的说法中正确的有( ). 5 Ⅰ.求解某一类问题的算法是唯一的 6 Ⅱ.算法必须在有限步操作之后停止 7 Ⅲ.算法的每一步操作必须是明确的,不能有歧义或含义模糊 8 Ⅳ.算法执行后一定产生确定的结果 9 A. 1个 B.2个 C.3个 D.4个 10 2. T(n)表示当输入规模为n时的算法效率,以下算法效率最优的是( ). 11 A.T(n)= T(n-1)+1,T(1)=1 B.T(n)= 2n2 12 C.T(n)

【转】编程词汇

很实用的编程英语词库,共收录一千五百余条词汇. 第一部分: application 应用程式 应用.应用程序 application framework 应用程式框架.应用框架 应用程序框架 architecture 架构.系统架构 体系结构 argument 引数(传给函式的值).叁见 parameter 叁数.实质叁数.实叁.自变量 array 阵列 数组 arrow operator arrow(箭头)运算子 箭头操作符 assembly 装配件 assembly language 组合语