1. 程式人生 > >資料結構與演算法題目集7-29——修理牧場

資料結構與演算法題目集7-29——修理牧場

我的資料結構與演算法題目集程式碼倉:https://github.com/617076674/Data-structure-and-algorithm-topic-set

原題連結:https://pintia.cn/problem-sets/15/problems/856

題目描述:

知識點:哈夫曼樹

思路:利用哈夫曼樹計算樹的最小帶權路徑長度

步驟如下:

(1)初始狀態下共有N個節點,節點的權值分別是給定的N個數,將它們視作N棵只有一個節點的樹。

(2)合併其中根節點權值最小的兩棵樹,生成兩棵樹根節點的父節點,權值為這兩個根節點的權值之和,這樣樹的數量就減少了一個。

(3)重複操作(2),直到只剩下一棵樹為止,這棵樹就是哈夫曼樹。

而對於本題,只需計算最小帶權路徑長度即可。

時間複雜度是O(NlogN)。空間複雜度是O(N)。

C++程式碼:

#include<iostream>
#include<queue>

using namespace std;

int N;
priority_queue<int, vector<int>, greater<int> > pq;

int main(){
	scanf("%d", &N);
	int num;
	for(int i = 0; i < N; i++){
		scanf("%d", &num);
		pq.push(num);
	}
	int result = 0;
	while(pq.size() > 1){
		int num1 = pq.top();
		pq.pop();
		int num2 = pq.top();
		pq.pop();
		int num = num1 + num2;
		pq.push(num);
		result += num;
	}
	printf("%d\n", result);
	return 0;
} 

C++解題報告: