九度題目1172:哈夫曼樹
題目1172:哈夫曼樹 時間限製:1 秒
內存限製:32 兆
特殊判題:否
提交:4366
解決:1827
題目描述:
哈夫曼樹,第一行輸入一個數n,表示葉結點的個數。需要用這些葉結點生成哈夫曼樹,根據哈夫曼樹的概念,這些結點有權值,即weight,題
目需要輸出所有結點的值與權值的乘積之和。
輸入:
輸入有多組數據。
每組第一行輸入一個數n,接著輸入n個葉節點(葉節點權值不超過100,2<=n<=1000)。
輸出:
輸出權值。
樣例輸入:
5
1 2 2 5 9
樣例輸出:
37
來源:
2010年北京郵電大學計算機研究生機試真題
構建一顆哈弗曼樹的方法:
1.根據給定的N{W1,W2,...,Wn}個權值構成N棵二叉樹的集合F={T1,T2,...,Tn},其中每課二叉樹Ti隻有一個帶權值為Wi的根節點,其左右子樹為
空。
2.在F中選取兩棵根節點最小的樹作為左右子樹構造一顆新的二叉樹,且置新的二叉樹的根節點的權值為其左右子樹上根節點的權值之和。
3.在F中刪除這兩科樹,同時將新得到的二叉樹加入到F中。
4.重複2和3,直到F隻含一棵樹為止,這棵樹便是哈弗曼樹。

思路:所有的非葉子節點之和就是答案
AC代碼:(沒有構建樹,僅僅模擬哈弗曼數組合節點)
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[1100];
int main()
{
int i,j,n,m,num,sum;
while(scanf("%d",&n)!=EOF)
{
memset(a,0,sizeof(a));
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n);
i=1;sum=0;
while(i<n)
{
sort(a+i-1,a+n);//每次都要重新排序,因為生成了新的節點
num=a[i]+a[i-1];//計算父親
sum+=num;//非葉子節點之和
a[i]=a[i]+a[i-1];//將小樹生成新的節點
i++;
}
printf("%d\n",sum);
}
return 0;
}
最後更新:2017-04-03 12:56:20