PAT甲級1122 Hamiltonian Cycle (25分)|C++實現
一、題目描述
原題連結
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:
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
二、解題思路
這道題其實知道Hamiltonian Cycle寫成序列之後的特點就可以順利做出來了,首先,要成為一個cycle,那麼前一個結點和後一個結點之間一定是連通的,此外,如果除了最後一個結點,中間某結點出現了兩次,那麼肯定也不是Hamiltonian Cycle,而且第一個數一定是要與最後一個數相同,才能構成一個環。把所有要素考慮進來,就不會錯了。
三、AC程式碼
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 220;
int G[maxn][maxn];
int main()
{
int N, M, a, b, K, num;
scanf("%d%d", &N, &M);
for(int i=0; i<M; i++)
{
scanf("%d%d", &a, &b);
G[a][b] = G[b][a] = 1;
}
scanf("%d", &K);
vector<int> v(K);
for(int i=0; i<K; i++)
{
scanf("%d", &num);
bool flag = true, simple = true, cycle = true;
int cnt[N+1] = {0}; //每個結點在題目給的序列中出現的次數
for(int j=0; j<num; j++)
{
scanf("%d", &v[j]);
cnt[v[j]]++;
if(j>0 && G[v[j-1]][v[j]] != 1) flag = false; //如果前後兩結點不相連,則不是Hamiltonian Cycle
if(j != num-1 && cnt[v[j]] > 1) simple = false; //除了最後一個結點,如果中間某結點出現了兩次
}
if(v[0] != v[num - 1] || num != N+1) cycle = false; //如果第一個結點不等於最後一個結點,或者總數目小於結點數+1,則不是cycle
(flag && simple && cycle) ? printf("YES\n") : printf("NO\n");
}
return 0;
}
相關文章
- PAT甲級1126~1130|C++實現C++
- PAT甲級1154 Vertex Coloring (25分)|C++實現C++
- PAT甲級1110 Complete Binary Tree (25分)|C++實現C++
- (非原創)PAT甲級1123 Is It a Complete AVL Tree (30分)|C++實現C++
- 【PAT甲級A1084】Broken Keyboard (20分)(c++)C++
- PAT甲級1032 Sharing
- 【PAT甲級A1038】Recover the Smallest Number (30分)(c++)C++
- PAT甲級1030 Travel Plan
- 浙大PAT甲級考試
- PAT甲級1023 Have Fun with Number
- 菜鳥記錄:c語言實現PAT甲級1010--RadixC語言
- 【PAT甲級A1065】A+B and C (64bit) (20分)(c++)C++
- PAT甲級-1015. Reversible Primes (20)
- PAT 甲級 1152 Google Recruitment (20分)GoUI
- 20年春季甲級pat考試
- PAT甲級-1014. Waiting in Line (30)(模擬)AI
- PAT甲級真題1069 數字黑洞(巧妙解法)
- PAT甲級考試題庫題目分類
- 2024 秋季PAT認證甲級(題解A1-A4)
- PAT甲級-1140. Look-and-say Sequence (20)(模擬)
- PAT乙級——1093(字串匹配)Java實現字串匹配Java
- 2021.9.12週六PAT甲級考試覆盤與總結
- 19年春季第二題 PAT甲級 1157 Anniversary(25 分)
- 2020年7月第2題 PAT甲級真題 The Judger (25分)
- 夕甲甲——孔乙己之C++版C++
- PAT(甲級)2020年秋季考試 7-1 Panda and PP Milk (20分)
- PAT-A Java實現Java
- PAT乙級——1092(陣列排序 自定義sort)Java實現陣列排序Java
- PAT 乙級
- 【PAT乙級、C++】1024 科學計數法 (20分)C++
- 【PTA甲級、C++簡單解答】1001 A+B Format (20分)C++ORM
- PTA甲級——Be Unique
- PAT乙級1023
- 2019年9月8日秋季PAT甲級題解-2-1161-Merging Linked Lists (25 分)
- 1021 Deepest Root(甲級)
- C++ 輕量級物件JSON序列化實現C++物件JSON
- PAT1013數素數C++C++
- PAT1076 WiFi密碼(java實現)WiFi密碼Java