ACM--哈夫曼树--九度OJ-1172

九度oj地址:http://ac.jobdu.com/problem.php?pid=1172


时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:8168

解决:3641

题目描述:

哈夫曼树,第一行输入一个数n,表示叶结点的个数。需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和。

输入:

输入有多组数据。
每组第一行输入一个数n,接着输入n个叶节点(叶节点权值不超过100,2<=n<=1000)。

输出:

输出权值。

样例输入:
5  
1 2 2 5 9
样例输出:
37
来源:
2010年北京邮电大学计算机研究生机试真题

第一种方法:不建树,这种方法要简单一点

#include 
#include 
#include 
#include
#include
using namespace std;
int result[1001];
//哈夫曼树的权值就是除了所有叶子
//的节点的权值的和
int main(){
    int n,i,sum,num;
    while(scanf("%d",&n)!=EOF){
        memset(result,0,n);
        for(i=0;i


第二种方法:建树

#include 
#include 
#include 
#include
#include
#define maxvalue 0x7fffffff//这个是int的最大值
using namespace std;
//创建节点的结构体
struct huffman{
    int weight;
    int parent,lchild,rchild;
}list[5000];
int main()
{
    int n,m;
    int i,j;
    int ans;
    int x1,x2;//用来存放树生成过程中的最小和次小的角标
    int m1,m2;//用来存放树生成过程中的最小和次小的值
    while(scanf("%d",&n)!=EOF)
    {
        m=2*n-1;
        for(i=0;i


 
 

你可能感兴趣的:(ACM算法,ACM刷题录)