三元哈弗曼编码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#include <cmath>
using namespace std;
const int maxn = 1000;
double num[maxn];
struct node3{ //存储节点信息
double v;
int flag, lef, mid, rig, num; //flag= 1表示原节点
}tree3[maxn*10];
struct cmp3{
bool operator()(node3 x, node3 y){//优先队列排列方式为:优先原节点及权值小的点
if( x.v == y.v) return x.flag < y.flag;
return x.v >y.v;
}
};
priority_queue<node3, vector<node3>, cmp3>q;//定义优先队列
int n, ans;
double l1, l2, l, d1, d2, d, hs, p1, p2, p;
//遍历哈弗曼树
void dfs(int p, char ch[100], int len){
//当遇到flag值为1时,即原点,输出,否则继续向下遍历
if( tree3[p].flag == 1){
l += 1.0*strlen(ch)*tree3[p].v;
d += tree3[p].v *((log(tree3[p].v)/log(2))*(log(tree3[p].v)/log(2)) - hs*hs);
printf(&