http://ac.jobdu.com/problem.php?cid=1040&pid=29
- 题目描述:
-
哈夫曼树,第一行输入一个数n,表示叶结点的个数。需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和。
- 输入:
-
输入有多组数据。
每组第一行输入一个数n,接着输入n个叶节点(叶节点权值不超过100,2<=n<=1000)。
- 输出:
-
输出权值。
- 样例输入:
-
5 1 2 2 5 9
- 样例输出:
-
37
// 题目30:哈夫曼树.cpp: 主项目文件。 //不使用优先队列(堆结构) #include "stdafx.h" #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <string> #include <set> #include <map> #include <queue> #include <stack> using namespace std; const int MAX=1<<30; const int N=20003; int a[N]; //int level[N]; bool used[N]; int n; int selectMin(int length) { int minIndex=-1,min=MAX; for(int i=0;i<length;i++) { if(!used[i]) { if(a[i]<min) { min=a[i]; minIndex=i; } } } return minIndex; } int huffmanTree() { int wholeWeight=0; //memset(level,0,sizeof(level)); memset(used,0,sizeof(used)); for(int i=0;i<n-1;i++) { int index1=selectMin(n+i); used[index1]=true; int index2=selectMin(n+i); used[index2]=true; a[n+i]=a[index1]+a[index2]; wholeWeight+=a[n+i]; } return wholeWeight; } int main() { //freopen("F:\\test.txt","r",stdin); //freopen("F:\\output.txt","w",stdout); while(cin>>n&&n!=0) { for(int i=0;i<n;i++) cin>>a[i]; int wholeWeight=huffmanTree(); cout<<wholeWeight<<endl; } return 0; }