admin管理员组文章数量:1516870
百炼:4080:Huffman编码树
4080:Huffman编码树
- 总时间限制:
- 1000ms 内存限制:
- 65536kB
- 描述
-
构造一个具有n个外部节点的扩充二叉树,每个外部节点Ki有一个Wi对应,作为该外部节点的权。使得这个扩充二叉树的叶节点带权外部路径长度总和最小:
Min( W1 * L1 + W2 * L2 + W3 * L3 + … + Wn * Ln)
Wi:每个节点的权值。
Li:根节点到第i个外部叶子节点的距离。
编程计算最小外部路径长度总和。
输入 - 第一行输入一个整数n,外部节点的个数。第二行输入n个整数,代表各个外部节点的权值。
2<=N<=100 输出 - 输出最小外部路径长度总和。 样例输入
-
41 1 3 5
样例输出 -
17
#include<iostream> #include<vector> #include<string> #include<map> #include<queue> #define INT_MAX 2000000000 using namespace std;struct node {int flag=0;int w;int parent;int leftchild, rightchild; };int main() {int n;cin >> n;vector<node> tree(2 * n - 1);for (int i = 0; i < n; i++){int tw;cin >> tw;node temp;temp.flag = 1;temp.leftchild = -1;temp.parent = -1;temp.rightchild = -1;temp.w = tw;tree[i] = temp;}for (int i = n; i < 2 * n - 1; i++){node temp;temp.parent = temp.leftchild = temp.rightchild = -1;tree[i] = temp;}for (int i = n; i < 2 * n - 1; i++){int minw1 = INT_MAX - 1;int minw2 = INT_MAX;int minl = -1;int minr = -1;for (int j = 0; j < i; j++){if (tree[j].parent==-1&&tree[j].w < minw1){minw2 = minw1;minr = minl;minw1 = tree[j].w;minl = j;}else if (tree[j].parent == -1 && tree[j].w < minw2){minw2 = tree[j].w;minr = j;}}tree[i].w = tree[minl].w + tree[minr].w;tree[i].leftchild = minl;tree[i].rightchild = minr;tree[minl].parent = i;tree[minr].parent = i;}int sum = 0;int layer = 1;queue<node> q;q.push(tree[2 * n - 2]);while (q.size() != 0){queue<node> tq;while (q.size() != 0){node cur = q.front();q.pop();int lnode = cur.leftchild;int rnode = cur.rightchild;if (lnode != -1){node t = tree[lnode];tq.push(t);if (t.flag == 1){sum += t.w*layer;}}if (rnode != -1){node t = tree[rnode];tq.push(t);if (t.flag == 1){sum += t.w*layer;}}}q = tq;layer++;}cout << sum << endl;system("pause"); }
本文标签: 百炼4080Huffman编码树
版权声明:本文标题:百炼:4080:Huffman编码树 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.betaflare.com/biancheng/1730861796a1531094.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。


发表评论