zoukankan      html  css  js  c++  java
  • 九度OJ1172--哈夫曼树

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

    输入:

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

    输出:

    输出权值。

    样例输入:
    5  
    1 2 2 5 9
    样例输出:
    37
    #include<stdio.h>
    struct huffman
    {
        int weight;
        int parent,lchild,rchild;
    }list[5000];
    int main(){
        int n,i,j,ans,lnode,rnode,m1,m2;
        while(~scanf("%d",&n)){
            for(i=0;i<2*n-1;i++)//所有节点的相关域初值为-1
                list[i].parent=list[i].lchild=list[i].rchild=-1;
            for(i=0;i<n;i++)
                scanf("%d",&list[i].weight);
            ans=0;
            for(i=n;i<2*n-1;i++){//构建哈夫曼树
                lnode=rnode=0;
                m1=m2=32767;
                for(j=0;j<i;j++){
                    if(list[j].weight<m1&&list[j].parent==-1){
                        rnode=lnode;
                        m2=m1;
                        lnode=j;
                        m1=list[j].weight;
                    }
                    else if(list[j].weight<m2&&list[j].parent==-1){
                        rnode=j;
                        m2=list[j].weight;
                    }
                }
                list[lnode].parent=i;list[rnode].parent=i;
                list[i].lchild=lnode;list[n+i].rchild=rnode;
                list[i].weight=list[lnode].weight+list[rnode].weight;
                ans+=list[i].weight;
            }
            printf("%d
    ",ans);
        }
    }
  • 相关阅读:
    OpenStack--Havana
    腾讯云万象优图每个账户提供50G的图片存储(支持黄图检测)
    Java 脚本化编程指南
    hive的表的基本操作
    如何搭建易企秀H5平台?
    HDU 4727-The Number Off of FFF
    审计厅审计云发展意见
    CNPM 遇到use strict的问题
    QA技术概览
    终端的CTRL+S 解说
  • 原文地址:https://www.cnblogs.com/OMG-By/p/5374153.html
Copyright © 2011-2022 走看看