题目30:哈夫曼树

来源:互联网 发布:远景suv usb共享网络 编辑:程序博客网 时间:2024/05/24 05:18

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;}


原创粉丝点击