PAT-ADVANCED1094——The Largest Generation
阿新 • • 發佈:2018-11-06
我的PAT-ADVANCED程式碼倉:https://github.com/617076674/PAT-ADVANCED
原題連結:https://pintia.cn/problem-sets/994805342720868352/problems/994805372601090048
題目描述:
題目翻譯:
1094 人數最多的一代
族層次結構通常由譜系樹呈現,其中同一級別上的所有節點屬於同一代。你的任務是找到人口最多的一代。
輸入格式:
每個輸入檔案包含一個測試用例。在每個測試用例中,第一行給出了兩個數字:0 < N < 100,代表樹中的節點個數;M( < N)代表非葉子節點個數。接下來的M行,每行都是下述格式:
ID K ID[1] ID[2] ... ID[K]
ID是一個2位數字,表示一個非葉子節點,K是該節點的孩子數量,緊跟著的是一串ID值以及該ID值對應的孩子數量。為了簡便,我們假設根節點的ID值是01。一行中的所有數字被一個空格分開。
輸出格式:
對每個測試用例,打印出人數最多的一代的人數及其代數。假設這樣的代數是唯一的,根結點是第一代。
輸入樣例:
23 13 21 1 23 01 4 03 02 04 05 03 3 06 07 08 06 2 12 13 13 1 21 08 2 15 16 02 2 09 10 11 2 19 20 17 1 22 05 1 11 07 1 14 09 1 17 10 1 18
輸出樣例:
9 4
知識點:樹的廣度優先遍歷、深度優先遍歷
思路一:深度優先遍歷的同時記錄節點的層級
本題和PAT-ADVANCED1079——Total Sales of Supply Chain與PAT-ADVANCED1090——Highest Price in Supply Chain考察的知識點相同,解法也近乎相同。
時間複雜度和空間複雜度均是O(N)。
C++程式碼:
#include<iostream> #include<vector> using namespace std; struct node { vector<int> child; }; int N; int M; node Node[101]; int count[101] = {0}; //第i層有count[i]個成員 void dfs(int nowVisit, int level); int main(){ cin >> N >> M; int ID, K, num; for(int i = 0; i < M; i++){ cin >> ID >> K; for(int j = 0; j < K; j++){ cin >> num; Node[ID].child.push_back(num); } } dfs(1, 1); int maxGeneration = 0; for(int i = 1; i <= N; i++){ if(count[i] > count[maxGeneration]){ maxGeneration = i; } } cout << count[maxGeneration] << " " << maxGeneration << endl; return 0; } void dfs(int nowVisit, int level){ count[level]++; if(Node[nowVisit].child.size() == 0){ return; } for(int i = 0; i < Node[nowVisit].child.size(); i++){ dfs(Node[nowVisit].child[i], level + 1); } }
C++解題報告:
思路二:廣度優先遍歷的同時為每個節點新增層級資訊
時間複雜度和空間複雜度均是O(N)。
C++程式碼:
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
struct node {
int level;
vector<int> child;
};
int N;
int M;
node Node[101];
int count[101] = {0}; //第i層有count[i]個成員
void bfs(int nowVisit);
int main() {
cin >> N >> M;
int ID, K, num;
for(int i = 0; i < M; i++) {
cin >> ID >> K;
for(int j = 0; j < K; j++) {
cin >> num;
Node[ID].child.push_back(num);
}
}
bfs(1);
for(int i = 1; i <= N; i++) {
count[Node[i].level]++;
}
int maxGeneration = 0;
for(int i = 1; i <= N; i++) {
if(count[i] > count[maxGeneration]) {
maxGeneration = i;
}
}
cout << count[maxGeneration] << " " << maxGeneration << endl;
return 0;
}
void bfs(int nowVisit) {
queue<int> q;
Node[nowVisit].level = 1;
q.push(nowVisit);
while(!q.empty()) {
int now = q.front();
q.pop();
for(int i = 0; i < Node[now].child.size(); i++) {
Node[Node[now].child[i]].level = Node[now].level + 1;
q.push(Node[now].child[i]);
}
}
}
C++解題報告: