#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=30;
int n;
int heap[maxn];
void downAdjust(int low,int high){
int i=low,j=i*2;
while(j<=high){
if(j+1<=high && heap[j]>heap[j+1])
j=j+1;
if(heap[i]>heap[j]){
swap(heap[i],heap[j]);
i=j;
j=i*2;
}
else break;
}
}
void upAdjust(int low,int high){
int i=high,j=i/2;
while(j>=low){
if(heap[i]<heap[j]){
swap(heap[i],heap[j]);
i=j;
j=i/2;
}
else break;
}
}
void insert(int x){
heap[++n]=x;
upAdjust(1,n);
}
void creatHeap(){
for(int i=n/2;i>=1;i--){
downAdjust(i,n);
}
}
void heapSort(){
for(int i=n;i>1;i--){
swap(heap[1],heap[i]);
downAdjust(1,i-1);
}
}
int popHeap(){
swap(heap[1],heap[n--]);
downAdjust(1,n);
return heap[n+1];
}
int main(int argc, char** argv) {
int ans=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&heap[i]);
creatHeap();
int N=n;
for(int i=0;i<N-1;i++){
int temp=0;
temp+=popHeap();
temp+=popHeap();
insert(temp);
ans+=temp;
}
printf("%d",ans);
return 0;
}
小顶堆计算最小带权路径
最新推荐文章于 2024-07-16 13:22:51 发布