先看一个题目:
题目描述
哈夫曼树,第一行输入一个数n,表示叶结点的个数。需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出哈夫曼树的带权路径长度。
输入描述:
输入有多组数据。 每组第一行输入一个数n,接着输入n个叶节点(叶节点权值不超过100,2<=n<=1000)。
输出描述:
输出带权路径长度。
示例1
输入
5 1 2 2 5 9
输出
37
这题用到一个结论:
哈夫曼树的带权路径长度 = 非叶子结点的权值之和
一个便于理解这个结论的思路如下:
1 #include <iostream> 2 #include <string> 3 #include <queue> 4 5 using namespace std; 6 7 int a[1010]; 8 9 int main() 10 { 11 12 int n; 13 while(cin >> n) 14 { 15 priority_queue<int, vector<int>, greater<int> > q; 16 for(int i = 0; i < n; ++i) 17 { 18 cin >> a[i]; 19 q.push(a[i]); 20 } 21 22 int ans = 0; 23 while(q.size() > 1) 24 { 25 int a = q.top(); 26 q.pop(); 27 int b = q.top(); 28 q.pop(); 29 ans += a + b; 30 q.push(a+b); 31 } 32 33 cout << ans << endl; 34 35 } 36 37 38 return 0; 39 }
来源:https://www.cnblogs.com/FengZeng666/p/12297761.html