北邮机试-哈夫曼树的带权路径长度

在这里插入图片描述

构建N个节点哈夫曼树需要合并N-1次。
方法一:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 105;
int buf[maxn];
int main(){
	int n;
	while(scanf("%d",&n)!=EOF){
		for(int i=0;i<n;i++){
			scanf("%d",&buf[i]);
		}
		int sum = 0,num;
		for(int i=1;i<n;i++){//n-1次合并 
			sort(buf+i-1,buf+n);
			num = buf[i-1]+buf[i];
			sum = sum+num;
			buf[i] = num;
		}
		printf("%d\n",sum);
		

		
	}
} 

方法二:STL的优先队列

#include<bits/stdc++.h>
using namespace std;
priority_queue<int,vector<int>,greater<int> > Q;
int main(){
	int n;
	while(scanf("%d",&n)!=EOF){
		while(Q.empty()==false){
			Q.pop();
		}
		for(int i=0;i<n;i++){ 
			int a;
			scanf("%d",&a);
		    Q.push(a);
		}
		int sum= 0;
		for(int i=1;i<n;i++){//n-1次合并 
			int a,b;
			a = Q.top();
			Q.pop();
			b = Q.top();
			Q.pop();
			sum = sum+a+b;
			Q.push(a+b);	
		}
		printf("%d\n",sum);
	} 
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/weixin_37762592/article/details/88743110