UVA10954哈夫曼树与优先队列
2016-03-21 23:49
337 查看
这个题就是一个最小堆,也就是常说的哈夫曼树,可以直接使用STL优先队列,先给一个哈夫曼树的代码,
建树,取堆值,插入值。
哈夫曼树:
STL优先队列:
建树,取堆值,插入值。
哈夫曼树:
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cctype> #include<cmath> #include<algorithm> #include<string> #include<map> #include<queue> #include<stack> #include<set> #include<vector> #define LL long long using namespace std; const int maxn=1e4+10; const double eps=1e-6; int a[maxn]; int n; void min_heap(int i) { int left=i*2,right=i*2+1; int min; if(left<=n&&a[left]<a[i]) min=left; else min=i; if(right<=n&&a[right]<a[min]) min=right; if(min!=i) { swap(a[i],a[min]); min_heap(min); } } void build_heap() { for(int i=n/2;i>=1;i--) min_heap(i); } void insert_heap(int num) { int i; for(i=++n;a[i/2]>num;i/=2) a[i]=a[i/2]; a[i]=num; } int delete_min() { int min_a,last_a; min_a=a[1]; last_a=a[n--]; int child; int i; for(i=1;i*2<=n;i=child) { child=i*2; if(child<n&&a[child+1]<a[child]) child++; if(last_a>a[child]) a[i]=a[child]; else break; } a[i]=last_a; return min_a; } int main() { while(cin>>n&&n) { memset(a,0,sizeof(a)); for(int i=1;i<=n;i++) scanf("%d",&a[i]); build_heap(); int sum=0; while(n!=1) { int min_n1,min_n2,add_n; min_n1=delete_min(); min_n2=delete_min(); add_n=min_n1+min_n2; sum+=add_n; insert_heap(add_n); } cout<<sum<<endl; } return 0; }
STL优先队列:
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cctype> #include<cmath> #include<algorithm> #include<string> #include<map> #include<queue> #include<stack> #include<set> #include<vector> #define LL long long using namespace std; const int maxn=1e4+10; const double eps=1e-6; priority_queue<int,vector<int>,greater<int> > q; int n; int main() { while(cin>>n&&n) { for(int i=1;i<=n;i++) { int x; scanf("%d",&x); q.push(x); } int sum=0; while(q.size()!=1) { int min_n1,min_n2,add_n; min_n1=q.top(); q.pop(); min_n2=q.top(); q.pop(); add_n=min_n1+min_n2; sum+=add_n; q.push(add_n); } q.pop(); cout<<sum<<endl; } return 0; }
相关文章推荐
- Spring源码之ApplicationContext(九)初始化剩余的单例
- Android 热补丁动态修复框架小结
- 没事画画图
- 1.1.2A+B for Input-Output Practice (II)
- Hrbust Online Judge 排列问题
- android的常用布局LinearLayout和RelativeLayout
- BZOJ4444 : [Scoi2015]国旗计划
- Codeforces 400C Inna and Huge Candy Matrix 【模拟】
- Spring源码之ApplicationContext(八)消息广播
- NYOJ-214-单调递增子序列(二)
- 基于django写的一个blog系统
- Debian下交换ctrl与esc键映射
- leetcode:Find Median from Data Stream
- 【ML】ICML2015_Unsupervised Learning of Video Representations using LSTMs
- 知识点5:ln链接
- python正则表达式
- The project target (Android N (Preview)) was not properly loaded.
- csh(tcsh)
- PSP记录个人项目耗时情况
- 设计模式学习笔记——状态模式