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 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
哈密顿回路问题是一个经典的NP问题,但是这道题上做了简化。我们仅需要判断一个路径是否为哈密顿回路。
1.第一个输入和最后一个输入一样
2.路径存在
3.每个点有且仅经过一次
#include <iostream> #include <set> #include <vector> #include <map> using namespace std; int N, M, K, a, b, n; set<int> G[99999]; int main() { scanf("%d%d", &N, &M); while(M--) { scanf("%d%d", &a, &b); G[a].insert(b); G[b].insert(a); } scanf("%d", &K); while(K--) { scanf("%d", &n); vector<int> data(n); map<int, int> m; for(int i = 0; i < n; i++) { scanf("%d", &data[i]); if(i != 0) m[data[i]]++; } bool no = false; if(data[0] != data[n - 1]) no = true; for(int i = 0; i < n - 1; i++) if(G[data[i]].count(data[i + 1]) == 0) no = true; if(m.size() != N) no = true; for(auto& x: m) if(x.second != 1) no = true; printf("%s\n", no ? "NO": "YES"); } return 0; }