正常想要计算哈夫曼树的路径长度之和,是遍历一遍树,将叶结点的权值乘上深度再加和。
那么对于路径和的计算有这样一个公式:
哈夫曼树的带权路径长度和=等于所有非叶节点的权值和
所以说我们只需要每次将数组前两个加到res中,再将两者的和放入数组中重新排序,直到数组中剩一个数停止
代码:
#include<bits/stdc++.h>
using namespace std;
int a[10010];
int main()
{
int n;
int res;
while(cin >> n)
{
if(n == 0)
break;
res = 0;
for(int i = 0 ; i < n ; i++)
{
cin >> a[i];
}
sort(a,a+n);
for(int i = 0 ; i < n ; i++)
{
if(i == n-1)
break;
res = res + a[i] + a[i+1];
a[i+1] = a[i]+a[i+1];
sort(a+i+1,a+n);
}
cout << res << endl;
}
return 0;
}