3834 Problem D Haffman编码

匿名 (未验证) 提交于 2019-12-02 23:26:52

问题 D: Haffman编码

时间限制: 1 Sec  内存限制: 128 MB
提交: 60  解决: 46
[提交][״̬][讨论版][命题人:外部导入]

题目描述

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

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
#define _CRT_SECURE_NO_WARNINGS #include <algorithm> #include <iostream> #include <cstring> using namespace std; const int MaxN = 110; int w[MaxN]; typedef struct data{ 	int weight; 	char val; }Key; typedef struct{ 	Key key; 	int parent, lchild, rchild; }HuffmanNode, *HuffmanTree; typedef char *HuffmanCode;  void seletTMin(HuffmanTree HT, int n, int &m1, int &m2){ 	int min = INT32_MAX; 	for (int i = 1; i <= n; ++i){ 		if (HT[i].parent == 0 && min >= HT[i].key.weight){ 			if (min > HT[i].key.weight){ 				min = HT[i].key.weight; 				m1 = i; 			} 			else{ 				if (HT[m1].key.val > HT[i].key.val) 					m1 = i; 			} 		} 	} 	min = INT32_MAX; 	for (int i = 1; i <= n; ++i){ 		if (HT[i].parent == 0 && min >= HT[i].key.weight && i != m1){ 			if (min > HT[i].key.weight){ 				min = HT[i].key.weight; 				m2 = i; 			} 			else{ 				if (HT[m2].key.val > HT[i].key.val) m2 = i; 			} 		} 	} }  void HuffmanCoding(HuffmanTree &HT, HuffmanCode *&HC, Key w[], int n){ 	if (n <= 1) return; 	int m = 2 * n - 1; 	HT = new HuffmanNode[m + 1]; 	for (int i = 1; i <= n; ++i){ 		HT[i].key = w[i]; 		HT[i].lchild = HT[i].rchild = HT[i].parent = 0; 	} 	for (int i = n + 1; i <= m; ++i) 		HT[i].lchild = HT[i].rchild = HT[i].parent = 0;  	for (int i = n + 1; i <= m; ++i){ 		int m1, m2; 		seletTMin(HT, i - 1, m1, m2); 		HT[i].lchild = m1; 		HT[i].rchild = m2; 		HT[m1].parent = HT[m2].parent = i; 		HT[i].key.weight = HT[m1].key.weight + HT[m2].key.weight; 	} 	HC = new HuffmanCode[n + 1]; 	char * cd = new char[n]; 	cd[n - 1] = 0; 	for (int i = 1; i <= n; ++i){ 		int start = n - 1; 		for (int c = i, f = HT[i].parent; f != 0; c = f, f = HT[f].parent){ 			if (HT[f].lchild == c) 				cd[--start] = '0'; 			else 				cd[--start] = '1'; 		} 		HC[i] = new char[n - start]; 		strcpy(HC[i], cd + start); 	}  	delete cd; }  int main(){ 	HuffmanTree HT; 	HuffmanCode *HC; 	int n; 	Key data[MaxN]; 	while (cin >> n){ 		for (int i = 1; i <= n; ++i) 			cin >> data[i].val >> data[i].weight;  		HuffmanCoding(HT, HC, data, n); 		for (int i = 1; i <= n; ++i) 			cout << data[i].val << ":" << HC[i] << endl;  		delete HC; 		delete HT; 	} 	return 0; }

 

转载请标明出处:3834 Problem D Haffman编码
文章来源: https://blog.csdn.net/qq_36502291/article/details/88854584
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!