1. 程式人生 > >PAT-ADVANCED1094——The Largest Generation

PAT-ADVANCED1094——The Largest Generation

我的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 ChainPAT-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++解題報告: