nyoj 801 Haffman编码


Haffman编码

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 3
描述

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

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

分析:

万恶的哈夫曼,完全不理解啊,我什么时候可以把它给搞清楚啊,那么都变量,那么多变化,

都不知道数据结构怎么就这么难呢

虽然是抄的代码,但还是要保存一下的,为了以后可以好好地研究一下

001. #include<stdio.h>
002. #include<string.h>
003. #include<algorithm>
004. #define INF 99999999;
005. using namespace std;
006. struct f
007. {
008. char ch,*str;
009. int w,p,l,r;
010. } num[200];
011. int main()
012. {
013. int m,n,min1,min2,s1,s2,i,j,s,c,q;
014. char *cd;
015. while(scanf("%d",&n)!=EOF)
016. {
017. for(i=1; i<=n; i++)
018. {
019. getchar();
020. scanf("%c%d",&num[i].ch,&num[i].w);
021. num[i].p=num[i].l=num[i].r=0;
022. }
023. m=2*n;
024. for(i=n+1; i<m; i++)
025. num[i].w=num[i].p=num[i].l=num[i].r=0;
026. //构造哈夫曼树
027. for(i=n+1; i<m; i++)
028. {
029. min1=min2=INF;
030. s1=s2=0;
031. for(j=1; j<=i-1; j++)
032. {
033.  
034. if(num[j].p!=0)
035. continue;
036. if(min1>num[j].w)
037. {
038. min2=min1;
039. min1=num[j].w;
040. s2=s1;
041. s1=j;
042. }
043. else if(min1==num[j].w&&num[s1].ch>num[j].ch)
044. {
045. min2=min1;
046. min1=num[j].w;
047. s2=s1;
048. s1=j;
049. }
050. else if(min2>num[j].w)
051. {
052. min2=num[j].w;
053. s2=j;
054. }
055. else if(min2==num[j].w&&num[s2].ch>num[j].ch)
056. {
057. min2=num[j].w;
058. s2=j;
059. }
060. }
061. num[i].w=num[s1].w+num[s2].w;
062. num[s1].p=i;
063. num[s2].p=i;
064. if(num[s1].w==num[s2].w)
065. {
066. if(num[s1].ch>num[s2].ch)
067. {
068. num[i].ch=num[s2].ch;
069. num[i].l=s2;
070. num[i].r=s1;
071. }
072. if(num[s1].ch<num[s2].ch)
073. {
074. num[i].ch=num[s1].ch;
075. num[i].l=s1;
076. num[i].r=s2;
077. }
078. }
079. else
080. {
081. num[i].ch=num[s1].ch;
082. num[i].l=s1;
083. num[i].r=s2;
084. }
085. }
086. cd=(char *)malloc(n*sizeof(char));
087. cd[n-1]='\0';
088. for(i=1; i<=n; i++)
089. {
090. s=n-1;
091. c=i;
092. q=num[i].p;
093. while(q!=0)
094. {
095. --s;
096. if(num[q].l==c)
097. cd[s]='0';
098. else
099. cd[s]='1';
100. c=q;
101. q=num[q].p;
102. }
103. num[i].str=(char *)malloc((n-s)*sizeof(char));
104. strcpy(num[i].str,&cd[s]);
105. }
106. free(cd);
107. for(i=1; i<=n; i++)
108. printf("%c:%s\n",num[i].ch,num[i].str);
109. }
110. return 0;
111. }

你可能感兴趣的:(nyoj 801 Haffman编码)