题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1053
用优先队列做,不过要注意不能用指针!
一开始用指针*lchild,*rchild,结果悲剧了!,好像说类或结构体中有指针,对象赋值时会存在危险,所以果断不用指针!
如有大神用指针AC该题,求代码!!!!
#include<iostream>
#include<cmath>
#include<cstdio>
#include<queue>
#include<iomanip>
using namespace std;
const int maxn = 1000000;
char str[maxn];
bool flag[27];
int bitnum;
int t;
int yx[27];
struct node{
double frequency;
bool isleaf;
int bitn;
int index;
int length;
int lchild, rchild;
friend bool operator <(const node &n1, const node &n2){
return n1.frequency > n2.frequency;
}
}nd[60];
void computeBit(node root, int len){
if (root.isleaf){
bitnum += len*root.bitn;
}
else{
computeBit(nd[root.lchild], len + 1);
computeBit(nd[root.rchild], len + 1);
}
}
void createHuffmTree(int origbitn){
priority_queue<node> q;
int i;
for (i = 0; i < t; i++){
q.push(nd[i]);
}
while (q.size() >= 2){
node nl = q.top();
q.pop();
node nr = q.top();
q.pop();
node merge;
merge.frequency = nl.frequency + nr.frequency;
merge.isleaf = false;
merge.lchild = nl.index;
merge.rchild = nr.index;
merge.index = t;
nd[t] = merge;
t++;
q.push(merge);
}
bitnum = 0;
if (q.size() == 1){
if (q.top().lchild == -1){
bitnum = q.top().bitn * 1;
}
else{
computeBit(q.top(), 0);
}
}
double fracy = double(origbitn) / double(bitnum);
cout << bitnum << " " << setiosflags(ios::fixed)<<setprecision(1)<< fracy << endl;
}
int input(){
char c;
int cnt = 0;
t = 0;
int i;
int g;
int nm = 0;
memset(flag, false, sizeof(flag));
while ((c = getchar()) != '\n'){
str[cnt++] = c;
if (c == '_'){
g = 26;
}
else
g = c - 'A';
if (!flag[g]){
flag[g] = true;
yx[g] = t;
nd[t].bitn = 1;
nd[t].index = t;
nd[t].isleaf = true;
nd[t].lchild = nd[t].rchild = -1;
t++;
nm++;
}
else{
int b = yx[g];
nd[b].bitn++;
}
}
str[cnt] = '\0';
if (strcmp(str, "END") == 0){
return 0;
}
cout << (cnt * 8) << " ";
for (i = 0; i < t; i++){
nd[i].frequency = double(nd[i].bitn) / double(cnt);
}
createHuffmTree(cnt * 8);
return 1;
}
int main(){
while (true){
if (!input()){
break;
}
}
return 0;
}