带权路径长度:从根结点到该结点的路径长度再乘以该结点权值
哈夫曼树的带权路径长度和:所有构造得到的中间结点(非叶子结点)的权值和
构造中,每次寻找权值最小的两个结点,使用堆优化指logn
#include<iostream> #include<cstdio> #include<queue> using namespace std; struct Int { Int(){} Int(int tmp) { num=tmp; } int num; bool operator <(const Int & B)const { return num>B.num; } }; priority_queue<Int> que; int main() { int n,res=0; scanf("%d",&n); for(int i=0;i<n;i++) { Int tmp; scanf("%d",&tmp.num); que.push(tmp); } while(1<que.size()) { Int i1=que.top(); que.pop(); Int i2=que.top(); que.pop(); res+=i1.num+i2.num; que.push(i1.num+i2.num); } printf("%d\n",res); return 0; }