3834 Problem D Haffman编码

问题 D: Haffman编码

时间限制: 1 Sec  内存限制: 128 MB
提交: 23  解决: 20
 

题目描述

哈弗曼编码大家一定很熟悉吧(不熟悉也没关系,自己查去。。。)。现在给你一串字符以及它们所对应的权值,让你构造哈弗曼树,从而确定每个字符的哈弗曼编码。当然,这里有一些小规定:

1.规定哈弗曼树的左子树编码为0,右子树编码为1;

2.若两个字符权值相同,则ASCII码值小的字符为左孩子,大的为右孩子;

3.创建的新节点所代表的字符与它的做孩子的字符相同;

4.所有字符为ASCII码表上32-96之间的字符(即“ ”到“`”之间的字符)。

输入

输入包含多组数据(不超过100组)
每组数据第一行一个整数n,表示字符个数。接下来n行,每行有一个字符ch和一个整数weight,表示字符ch所对应的权值,中间用空格隔开。
输入数据保证每组测试数据的字符不会重复。

输出

对于每组测试数据,按照输入顺序输出相应的字符以及它们的哈弗曼编码结果,具体格式见样例。

样例输入

3
a 10
b 5
c 8
4
a 1
b 1
c 1
d 1

样例输出

a:0
b:10
c:11
a:00
b:01
c:10
d:11

经验总结

这题要按照题目说的来,在基本的哈弗曼树编码上,做一些小的修改就可以啦,问题不大~~

正确代码

#include 
#include 
#include 
#include 
using namespace std;
const int maxn=110;
struct HuffNode
{
	int w,parent,lchild,rchild;
	char s;
}Node[maxn*2];
void SearchMin(int &a,int &b,int n)
{
	int min=INT_MAX;
	for(int i=1;i<=n;++i)
	{
		if(Node[i].parent==0&&Node[i].wb)
	{
		swap(a,b);
	}
	if(Node[a].w==Node[b].w&&Node[a].s>Node[b].s)
	{
		swap(a,b);
	}
}
void HuffmanCode(int n,char * s,int * w,char * * &ans)
{
	int m=2*n-1;
	for(int i=1;i<=n;++i)
	{
		Node[i].parent=Node[i].lchild=Node[i].rchild=0;
		Node[i].w=w[i];
		Node[i].s=s[i];
	}
	for(int i=n+1;i<=m;++i)
	{
		int a,b;
		SearchMin(a,b,i-1);
		Node[i].lchild=a;
		Node[i].rchild=b;
		Node[i].w=Node[a].w+Node[b].w;
		Node[i].parent=0;
		Node[i].s=Node[a].s;
		Node[a].parent=Node[b].parent=i;
	}
	int c,f,index=0;
	char temp[n];
	ans=new char * [n+1];
	for(int i=1;i<=m;++i)
		Node[i].w=0;
	while(m)
	{
		if(Node[m].w==0)
		{
			Node[m].w=1;
			if(Node[m].lchild!=0)
			{
				m=Node[m].lchild;
				temp[index++]='0';
			}
			else if(Node[m].rchild==0)
			{
				ans[m]=new char[index+1];
				temp[index]='\0';
				strcpy(ans[m],temp);
			}
		}
		else if(Node[m].w==1)
		{
			Node[m].w=2;
			if(Node[m].rchild!=0)
			{
				m=Node[m].rchild;
				temp[index++]='1';
			}
		}
		else
		{
			Node[m].w=0;
			m=Node[m].parent;
			--index;
		}
	}
}
int main()
{
	int n,w[maxn];
	char s[maxn];
	char * * ans;
	while(~scanf("%d",&n))
	{
		for(int i=1;i<=n;++i)
		{
			getchar();
			scanf("%c %d",&s[i],&w[i]);
		}
		HuffmanCode(n,s,w,ans);
		for(int i=1;i<=n;++i)
		{
			printf("%c:%s\n",s[i],ans[i]);
		}
	}
	delete ans;
    return 0;
}

 

你可能感兴趣的:(经验总结,Haffman编码,codeup,C)