PTA 05-树9 Huffman Codes中wpl计算相关问题

1.解题思路

本题借鉴:浙大数据结构05-树9 Huffman Codes_哈夫曼树_shu.da-ho9-CSDN博客

2.代码

#include <bits/stdc++.h>
using namespace std;

priority_queue<int,vector<int>,greater<int>> q;
unordered_map<char,int> un_map;
int n,m,wpl=0;
int cmp(string&a,string&b){
    return a.size()<b.size();
}

//判断是否为前缀
int isPrefix(string code[]){
    sort(code,code+n,cmp);
    for(int i=0;i<n;i++){
        for(int j=i+1;j<n;j++){
            if(code[j].substr(0,code[i].size())==code[i]){
                return 1;
            }
        }
    }
    return 0;
}

int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        char ch;
        int frequency;
        cin>>ch;
        cin>>frequency;
        un_map[ch]=frequency;
        q.push(frequency);
    }
    while(q.size()>1){
        int x=q.top();
        q.pop();
        int y=q.top();
        q.pop();
        q.push(x+y);
        wpl+=x+y;
    }
    cin>>m;
    while(m--){
        int res=0;
        char ch;
        string code[64];
        for(int i=0;i<n;i++){
            cin>>ch;
            cin>>code[i];
            res += code[i].size()*un_map[ch];
        }
        if(res!=wpl||isPrefix(code)){
            if(m!=0){
                cout<<"No"<<endl;
            }
            else{
                cout<<"No";
            }
        }
        else{
            if(m!=0){
                cout<<"Yes"<<endl;
            }
            else{
                cout<<"Yes";
            }
        }
    }
    return 0;
}

3.WPL计算解释

计算WPL时,主要根据一个所有非叶节点相加即为WPL值。

如图,该树的WPL = 2A + 2B + D

又因为 C = A + B,E = C + D = A + B + D

所以 C+E = 2A + 2B + D = WPL

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值