zoukankan      html  css  js  c++  java
  • sicily Huffman coding

    霍夫曼编码,这个是把霍夫曼树也建好了的!必须把输入改为char才能ac,好坑......

    http://soj.sysu.edu.cn/show_problem.php?pid=1002&cid=1740

     1 #include <iostream>
     2 #include <cstring>
     3 #include <queue>
     4 #include <algorithm>
     5 #include <vector>
     6 #include <cstdio>
     7 
     8 using namespace std;
     9 
    10 struct HuffmanNode {
    11     char ch;
    12     int frequency;
    13     HuffmanNode *lc, *rc;
    14     HuffmanNode():ch(0), frequency(0), lc(NULL), rc(NULL){}
    15 };
    16 
    17 struct cmp {
    18     bool operator()(HuffmanNode* a, HuffmanNode* b)
    19     {
    20         return a->frequency > b->frequency;
    21     }
    22 };
    23 
    24 vector<int> v;     
    25 void code(HuffmanNode* r)    
    26 {     
    27     if(r->lc==NULL && r->rc==NULL)     
    28     {     
    29         cout << r->ch <<": ";     //打印字符的编码   
    30         for (int i = 0; i<v.size(); i++)     
    31             cout << v[i];     
    32         cout << endl;     
    33         v.pop_back(); //注意pop    
    34         return ;     
    35     }     
    36     if(r->lc)     
    37     {     
    38         v.push_back(0);     
    39            code(r->lc);     
    40     }     
    41     if(r->rc)     
    42     {     
    43         v.push_back(1);     
    44         code(r->rc);     
    45     }    
    46     if(!v.empty())       
    47         v.pop_back();  //注意pop         
    48 }    
    49 
    50 int main()
    51 {
    52     int n;
    53     cin >> n;
    54     char ch;// c;
    55     int f;
    56     
    57     priority_queue<HuffmanNode*, vector<HuffmanNode*>, cmp>q;
    58     
    59     for(int i=0; i<n; i++)
    60     {
    61         HuffmanNode* h = new HuffmanNode;
    62         cin >> ch >> f;
    63         //scanf("%c %d", &ch, &f);
    64         h->ch = ch;
    65         h->frequency = f;
    66         q.push(h);
    67     }
    68 
    69     int res=0;
    70     while(q.size() > 1)
    71     {
    72         HuffmanNode* temp1 = new HuffmanNode;
    73         temp1 = q.top();
    74         q.pop();
    75         HuffmanNode* temp2 = new HuffmanNode;
    76         temp2 = q.top();
    77         q.pop();
    78         
    79         HuffmanNode* temp = new HuffmanNode;
    80         temp->frequency = temp1->frequency + temp2->frequency;
    81         temp->lc = temp1;
    82         temp->rc = temp2;
    83         
    84         res += temp1->frequency + temp2->frequency;    
    85         q.push(temp);
    86     }
    87     cout << res << endl;
    88     HuffmanNode* root = q.top();
    89     //code(root);
    90     
    91     return 0;
    92 }
  • 相关阅读:
    关于Python装饰器内层函数为什么要return目标函数的一些个人见解
    多项式拟合与线性回归
    numpy基本方法总结 --good
    numpy中的convolve的理解
    最容易理解的对卷积(convolution)的解释
    Python之numpy基本指令
    线性回归原理小结
    矩阵的导数与迹
    【MyBatis学习14】MyBatis和Spring整合
    【MyBatis学习13】MyBatis中的二级缓存
  • 原文地址:https://www.cnblogs.com/dominjune/p/4386752.html
Copyright © 2011-2022 走看看