帶權路徑長度:從根結點到該結點的路徑長度再乘以該結點權值
哈夫曼樹的帶權路徑長度和:所有構造得到的中間結點(非葉子結點)的權值和
構造中,每次尋找權值最小的兩個結點,使用堆優化指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; }
