一、问题描述
构造一颗包含\(n\)个叶子节点的\(k\)叉树,其中第\(i\)个叶子节点带有权值\(w_i\),要求最小化\(\sum w_i*l_i\),其中\(l_i\)表示第\(i\)个叶子节点到根节点的距离。
二、算法描述
运用贪心的思想,权值大的叶子结点的深度一定要小。
先考虑\(k=2\)的情况,我们不难想出一种贪心算法:
1.建立一个小根堆,插入这\(n\)个叶子节点的权值。
2.从堆中取出最小的两个权值\(w_1\)和\(w_2\),令\(ans+=w_1+w_2\)。
3.建立一个新的节点\(p\),权值为\(w_1+w_2\),令\(p\)成为取出的两个节点的父亲。
4.在堆中插入权值\(w_1+w_2\)。
5.重复第\(2~4\)步,直到堆得大小为\(1\)。
Luogu P1090
接着再扩展到\(k>2\)的情况:
标签:编码,哈夫曼,以及,叶子,算法,权值,节点,贪心 来源: https://www.cnblogs.com/nofind/p/16342651.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。