• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
村雨sup
自己选的路,跪着也要走完 XD
博客园    首页    新随笔    联系   管理    订阅  订阅
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), 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

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define MAXN 500

int n,m;
int G[MAXN][MAXN] = {0};





int main(){
    cin >> n >> m;
    for(int i=0;i < m;i++){
        int x,y; cin >> x >> y;
        G[x][y] = G[y][x] = 1;
    }

    int K;
    cin >> K;
    while(K--){
        int nnn; cin >> nnn;
        vector<int> temp;
        set<int> st;
        for(int i=0;i < nnn;i++){
            int num;cin >> num;
            temp.push_back(num);
            st.insert(num);
        }
        int flag1=1;
        int flag2=1;
        if(st.size()!=n||nnn-1!=n||temp[0]!=temp[nnn-1]) flag1=0;

        for(int i=1;i < temp.size();i++){
            if(!G[temp[i-1]][temp[i]])flag2=0;
        }
        if(flag1&&flag2) cout << "YES" << endl;
        else cout << "NO" << endl;

    }




    return 0;
}

看了答案才知道这么简单,一开始理解错了题意,后来才发现他给的就是路径,难度就降低了

分析:1.设置falg1 判断节点是否多走、少走、或走成环
2.设置flag2 判断这条路能不能走通
3.当falg1、flag2都为1时是哈密尔顿路径,否则不是

posted on 2019-05-04 16:00  村雨sup  阅读(142)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3