Hdu 1053 Entropy

来源:互联网 发布:威海博优化纤怎么样 编辑:程序博客网 时间:2024/05/18 03:44

大意:裸地哈弗曼编码,而且不要求输出编码,只要求输出最短长度。

思路:可以与Hdu 2527 用一样的方法水过,因为这里不需要求编码,但我写这一题主要是为了学习哈弗曼建树,所以也用建树的方法写了一遍。建好树后,我们可以通过DFS遍历树,也可以通过BFS遍历树。

CODE:

#include <iostream>#include <cstdlib>#include <cstdio>#include <queue>using namespace std;const int MAXN = 1010;struct node{int data;int dep;node *L, *R;node(){data = 0;dep = 0;L = NULL;R = NULL;}bool operator <(node a) const{return a.data < data;} //重载小于号 };int ans;char str[MAXN];int huf[MAXN];priority_queue<node> Q;void BuildHuffman(){node *p, *q, *T;while(Q.size() != 1){p = new node();q = new node();T = new node();*p = Q.top(); Q.pop();*q = Q.top(); Q.pop();T->data = p->data + q->data;T->L = p, T->R = q;Q.push(*T);}}queue<node> q;void solve(){node root;root = Q.top(); Q.pop();root.dep = 0;q.push(root);while(!q.empty()){node x = q.front(); q.pop();if(x.L){x.L->dep = x.dep + 1;q.push(*(x.L));}if(x.R){x.R->dep = x.dep + 1;q.push(*(x.R));}if(!x.L && !x.R){ans += x.dep * x.data;}}}void dfs(node *p, int dep){if(!p->L && !p->R){ans += p->data * dep;return ;}if(p->L){dfs(p->L, dep+1);}if(p->R){dfs(p->R, dep+1);}}void init(){ans = 0;while(!Q.empty()) Q.pop();while(!q.empty()) q.pop();memset(huf, 0, sizeof(huf));}int main(){while(scanf("%s", str) && strcmp(str, "END")){init();int len = strlen(str);for(int i = 0; str[i]; i++){huf[str[i]]++;}for(int i = 0; i < 100; i++) if(huf[i]){node t;t.data = huf[i];Q.push(t);}if(Q.size() == 1) //特判{printf("%d %d 8.0\n", len*8, len);continue;}BuildHuffman();solve();//node root = Q.top(); Q.pop();//dfs(&root, 0);printf("%d %d %.1lf\n", len*8, ans, len*8.0/ans);}return 0;}



原创粉丝点击