您的位置:首页 > 编程语言 > C语言/C++

C++(STL)&&树-堆结构练习——合并果子之哈夫曼树

2014-08-06 10:31 309 查看
题目题解:http://blog.csdn.net/xu12110501127/article/details/9199335

有关博客:http://www.360doc.com/content/10/1118/16/963301_70454649.shtml 优先队列不错的博客。

priority_queue 对于基本类型的使用方法相对简单。
他的模板声明带有三个参数,priority_queue<Type, Container, Functional>
Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。
Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list.
STL里面默认用的是 vector. 比较方式默认用 operator< ,

所以如果你把后面俩个
参数 缺省的话,优先队列就是大顶堆,队头元素最大。

如果要用到小顶堆,则一般要把模板的三个参数都带进去。
STL里面定义了一个仿函数 greater<>,对于基本类型可以用这个仿函数声明小顶堆
例子:

1 #include <iostream>
2 #include <cstdio>
3 #include <queue>
4 #include <vector>
5 #include <algorithm>
6 #define LL long long
7 using namespace std;
8
9 struct node
10 {
11     int x, y;
12     bool operator < (const node &tmp)const
13     {
14         return x > tmp.x;
15     }
16 };
17 int main()
18 {
19     priority_queue<int>q1;  //基本类型从大到小
20     priority_queue<int, vector<int>, greater<int> >q2;  //基本类型从小到大
21     priority_queue<node>q3;  //自定义类型
22     return 0;
23 }

http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=203#problem/A


#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <queue>
#include <vector>
using namespace std;

int main()
{
int n,a,sum,sum1;
long long int count;
priority_queue<int, vector<int>, greater<int> >q;
while(scanf("%d",&n)!=EOF)
{
count=0;
for(int i=1; i<=n; i++)
{
scanf("%d",&a);
q.push(a);
}
if(n==1)
{
printf("%d\n",count);
continue;
}
else
{
while(!q.empty())
{
sum=q.top();
q.pop();
if(q.empty())
{
break;
}
sum1=q.top();
q.pop();
q.push(sum+sum1);
count=count+sum+sum1;
}
printf("%d\n",count);
}

}
return 0;
}


#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>

#include <queue>//队列的头文件

using namespace std;

int a[10000];

int main()

{
int n,a1,a2,i;

int sum=0;
cin>>n;
for(i=0;i<n;i++)
{
cin>>a[i];
}
priority_queue<int , vector<int> , greater<int> >q;//从小到大排列
for(i=0;i<n;i++)
{
q.push(a[i]);//进入队列
}
while(q.size()>1)//因为最后只剩下一组,所以控制长度大于1
{
a1=q.top();//将a1定义为首元素
q.pop();//出队列
a2=q.top();//将a2定义为首元素
q.pop();//出队列
sum+=a1+a2;
q.push(a1+a2);//这里注意将a1+a2进入队列,而不是sum
}
cout<<sum<<endl;//最后输出sum
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: