poj 3253 哈夫曼树

背景

:开始自己想了一个贪心思路,结果是错的。其实这个题是哈夫曼树的思想,贪心只是哈夫曼树的证明和构造思想。

哈夫曼树:一种带权最短二叉树(也就是所有叶子节点的权重乘以深度的和最小),在实际中是用来做最高效信息编码的。信息的频率就是权重,一个频率很低的数,它的编码就应该长,树的深度就应该大。实际信息编码会根据信息字符的频率来构建一个哈夫曼树,已达到最高效。

本题和哈夫曼树是一个很好的契合,解决本题的贪心思想也是构建哈夫曼树的方法,以最小的两个元素为最后砍开的段,然后把这两个元素加起来,就可以构成一个新的元素。这里书上是O(n^2)的方法,每次的去查找最小的两个数,而标准方法是用priority_queue查找只要logn就是nlogn的算法,而我用的set理论上也是nlogn的算法。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
int str[20009],n;
typedef long long int LL;
int main(void){
    while(~scanf("%d", &n)) {
        LL ans = 0;
        multiset<int> S;
        for(int i = 0; i < n; i++) {
            int x;
            scanf("%d", &x);
            S.insert(x);
        }
        while(S.size() > 1) {
            multiset<int>::iterator it = S.begin();
            int temp = *it;
            S.erase(it);
            it = S.begin();
            temp += *it;
            S.erase(it);
            ans += temp;
            S.insert(temp);
        }
        printf("%lld\n", ans);
    }
    return 0;
}
时间: 2024-10-13 03:15:54

poj 3253 哈夫曼树的相关文章

poj 3253 Fence Repair(优先队列+哈夫曼树)

题目地址:POJ 3253 哈夫曼树的结构就是一个二叉树,每一个父节点都是两个子节点的和.这个题就是可以从子节点向根节点推. 每次选择两个最小的进行合并.将合并后的值继续加进优先队列中.直至还剩下一个元素为止. 代码如下: #include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <cty

POJ 3253 Fence Repair 类似哈夫曼树的贪心思想

Fence Repair Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 24550   Accepted: 7878 Description Farmer John wants to repair a small length of the fence around the pasture. He measures the fence and finds that he needs N (1 ≤ N ≤ 20,000)

POJ 3253 Fence Repair(哈夫曼树)

Fence Repair Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 26167   Accepted: 8459 Description Farmer John wants to repair a small length of the fence around the pasture. He measures the fence and finds that he needs N (1 ≤ N ≤ 20,000)

哈夫曼树 POJ 3253 Fence Repair

竟然做过原题,一眼看上去竟然没感觉... 哈夫曼树定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近. 1.路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径.通路中分支的数目称为路径长度.若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1. 2.结点的权及带权路径长度 若将树中结点赋给一个有着某

POJ 3253 Fence Repair(优先队列,哈夫曼树)

题目 //做哈夫曼树时,可以用优先队列(误?) //这道题教我们优先队列的一个用法:取前n个数(最大的或者最小的) //哈夫曼树 //64位 //超时->优先队列,,,, //这道题的优先队列用于取前2个小的元素 #include <iostream> #include<stdio.h> #include<string.h> #include<algorithm> #include<queue> using namespace std; _

哈夫曼树---POJ3253

http://poj.org/problem?id=3253 这就是 最典型的哈夫曼树的题型,我们就根据这道题学习一下哈夫曼树 这是最开始我们把21据下来之后我们据下8,然后再据下5得到34,可以看出13被用到2次,8被用到1次13*2+8=34. 这幅图片,我们先据下21,再据下5,再据下8得到34,即16*2+5=37. 所以,对于这道题,我们运用贪心的思想和哈夫曼树 1 #include<queue> 2 #include<stdio.h> 3 using namespace

poj3253 Fence Repair【哈夫曼树+优先队列】

Description Farmer John wants to repair a small length of the fence around the pasture. He measures the fence and finds that he needs N (1 ≤ N ≤ 20,000) planks of wood, each having some integer length Li (1 ≤ Li ≤ 50,000) units. He then purchases a s

由二叉树构造赫夫曼树

赫夫曼树: 假设有n个权值{w1,w2,w3....},试构造一棵具有n个叶子节点的二叉树,每个叶子节点带权为wi,则其中带权路径长度最小的二叉树称为最优二叉树或者叫赫夫曼树. 构造赫夫曼树: 假设有n个权值,则构造出的赫夫曼树有n个叶子节点,n个权值分别设置为w1,w2,....wn,则赫夫曼树的构造规则为: 1.将w1,w2...看成是有n棵树的森林: 2.在森林中选择两个根节点的权值最小的树合并,作为一棵新树的左右子树,且新树的根节点权值为其左右子树根节点权值之和: 3.从森林中删除选取的

php 二叉树 与赫夫曼树

在学习图之前,中间休息了两天,感觉二叉树需要消化一下.所以中间去温习了下sql,推荐一本工具书<程序员的SQL金典>看名字不像一本好书,但是作为一个不错的SQL工具书还是可以小小备忘一下.涵盖内容不详细但是挺广,覆盖多种主流数据库 言归正传,以前知道折半查找,二叉树的概念也是感觉挺有意思,二叉树的实现有一个案例很不错,代码如下 class BiNode{ public $data; public $lchild; public $rchild; public function __constr