PAT--1122. Hamiltonian Cycle (25)
来源:互联网 发布:淘宝儿童丝袜模特 编辑:程序博客网 时间:2024/04/30 22:27
Description
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
- 除首尾外,不会再有相同的顶点。
- 序列中相邻的两个顶点要求有边相连。
满足这些条件可以判断这是一条哈密顿回路。
#include <iostream>#include <cstdio>#include <algorithm>#include <vector>#include <queue>#include <map>#include <string>#include <set>using namespace std;const int maxn = 200 + 10;int n, m, k;vector<int> G[maxn];bool connect(int u, int v){ for(int i = 0; i < G[u].size(); ++i){ if(G[u][i] == v) return true; } return false;}bool judge(vector<int>& path){ int len = path.size(); if(len != n + 1) return false; if(path[0] != path[len - 1]) return false; vector<int> vis(path.begin(), path.end() - 1); sort(vis.begin(), vis.end()); for(int i = 0; i < vis.size(); ++i){ if(vis[i] != i + 1) return false; } for(int i = 0; i < path.size() - 1; ++i){ int u = path[i], v = path[i + 1]; if(!connect(u, v)) return false; } return true;}int main(){#ifndef ONLINE_JUDGEfreopen("data.in", "r", stdin);#endif cin >> n >> m; int u, v; for(int i = 0; i < m; ++i){ cin >> u >> v; G[u].push_back(v); G[v].push_back(u); } cin >> k; for(int i = 0; i < k; ++i){ int t; cin >> t; vector<int> path; path.resize(t); for(int j = 0; j < t; ++j){ cin >> path[j]; } if(judge(path)) cout << "YES" << endl; else cout << "NO" << endl; } return 0;}
- PAT--1122. Hamiltonian Cycle (25)
- pat 1122. Hamiltonian Cycle (25)
- PAT-1122. Hamiltonian Cycle (25)
- 【PAT】1122. Hamiltonian Cycle
- pat甲级 1122. Hamiltonian Cycle (25)
- 1122. Hamiltonian Cycle (25) PAT 甲级
- PAT (Advanced Level) 1122. Hamiltonian Cycle (25)
- PAT甲级 1122. Hamiltonian Cycle (25)
- 【PAT】【Advanced Level】1122. Hamiltonian Cycle (25)
- PAT 甲级 1122. Hamiltonian Cycle (25)
- PAT A1122 hamiltonian cycle (25)
- PAT A1122. Hamiltonian Cycle (25)
- 1122. Hamiltonian Cycle (25)
- 1122. Hamiltonian Cycle (25)
- 1122. Hamiltonian Cycle (25)
- 1122. Hamiltonian Cycle (25)
- 1122. Hamiltonian Cycle (25)
- 1122. Hamiltonian Cycle (25)
- UIP移植到CC2530上
- 单片机学习第一章
- 拷贝构造和赋值构造
- java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()L
- nginx+lua+redis使用
- PAT--1122. Hamiltonian Cycle (25)
- HBase数据模型的一些概念
- 冒泡排序,插入排序,快速排序,归并排序,堆排序,选择排序,希尔排序
- 错误提示:需要标识符
- Python
- 常用的Linux发行版
- 程序员面试金典——最大连续数列和
- 8 puzzle with A* algorithm
- 《编程之美》 -- 中国象棋将帅问题和一摞烙饼的排序