Entropy hdu1053 哈夫曼树

   自己写的第一个哈夫曼树,纪念一下下委屈

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>

using namespace std;
struct node
{
	int w;
	node *left,*right;
};
node *root,memory[1000];
struct cmp
{
	bool operator()(int a,int b)
	{
		return memory[a].w>memory[b].w;
	}
};
int p[27],size,ans;

bool build()//建哈夫曼树
{
	priority_queue<int,vector<int>,cmp>q;
	size=0;
	for(int i=0;i<27;i++)
		if(p[i])
		{
			node *ptr=&memory[size];
			ptr->left=ptr->right=NULL;
			ptr->w=p[i];
			q.push(size);
			size++;
		}
	if(size==1)//只有一种字母(特殊处理)
		return false;
	while(!q.empty())
	{
		int min1=q.top();
		q.pop();
		int min2=q.top();
		q.pop();
		node *ptr=&memory[size];
		ptr->left=&memory[min1];
		ptr->right=&memory[min2];
		ptr->w=memory[min1].w+memory[min2].w;
		root=ptr;
		if(!q.empty())
			q.push(size);
		size++;
	}
}

void dfs_tree(node *p,int depth)//遍历数
{
	if(p->left==NULL&&p->right==NULL)
	{
		ans+= depth*p->w;
		return;
	}
	dfs_tree(p->left,depth+1);
	dfs_tree(p->right,depth+1);
}

int main()
{
	char s[10000],len;
	while(gets(s))
	{
		if(strcmp(s,"END")==0)
			break;
		memset(p,0,sizeof(p));
		len=0;
		while(s[len])
		{
			if(s[len]=='_')
				p[26]++;
			else
				p[s[len]-'A']++;
			len++;
		}
		if(!build())
		{
			printf("%d %d 8.0\n",len*8,len);
			continue;
		}
		ans=0;
		dfs_tree(root,0);
		printf("%d %d %.1lf\n",len*8,ans,len*8.0/ans);
	}
	return 0;
}


 

你可能感兴趣的:(Entropy hdu1053 哈夫曼树)