文章

20

粉丝

223

获赞

52

访问

125.4k

头像
哈夫曼树带权路径长度(WPL)的简便算法
P1382 北京邮电大学/兰州大学2019年机试
发布于2022年2月4日 13:28
阅读数 12.4k

首先,结点的带权路径长度 = 从根结点到该结点之间的路径长度 X 该结点的权,但是,计算WPL其实可以不用刻意算出每个结点的到根节点的路径长度,我们只需在构造哈夫曼时除根节点以外的节点权值加和就好了,因为在加和过程中越靠下的节点被加了多次,这个次数其实也就是它离根节点的路径长度,具体的证明可以参考这篇文章:哈夫曼树带权路径长度简便算法

#include<iostream>
#include<queue>
using namespace std;

struct node {
	int x;
	// 定义优先队列的比较关系,这里我们定义的是小根堆 
	bool operator < (const node& a) const {
        return x > a.x;
    }
};

int main() {
	int n, x;
	while (scanf("%d", &n) != EOF) {
		priority_queue<node> q;
		while (n--) {
			cin >> x;
			q.push(node{x});
		}
		int ans = 0;
		while (q.size() > 1) {
			node num1 = q.top();
			q.pop();
			node num2 = q.top();
			q.pop();
			ans += num1.x + num2.x;
			q.push(node{num1.x + num2.x});
		}
		cout << ans << endl;
	}
}

 

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发