您的位置:首页 > 其它

UVA10954哈夫曼树与优先队列

2016-03-21 23:49 337 查看
这个题就是一个最小堆,也就是常说的哈夫曼树,可以直接使用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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: