鱼C论坛

 找回密码
 立即注册
查看: 2805|回复: 1

最短带权路径长度(哈夫曼树)

[复制链接]
发表于 2021-6-6 23:24:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
https://paste.ubuntu.com/p/RpTQvDPxcP/
这是我的代码 本来以为已经解决这道题了 后来才发现我这样每次只考虑了3个数据  假设权值有大量重复 比如 2 2 2 2 2 我跑出来的结果就是28  而不是正确答案24 想请问一下有什么好的方法解决吗(不能使用其他头文件)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-6-8 09:21:27 | 显示全部楼层
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int Heap[50001];//从1开始计数
int size=0; //heap size
void insert(int val) {
  int i = ++size;
   //please finish the following parts
  while (i > 1 && val < Heap[i/2]  ){ //finish this bracket
        Heap[i] = Heap[i/2];
        i = i / 2;
  }
  Heap[i] = val;
}
int delete_min() {
  int val = Heap[size--], ret = Heap[1];
  int i = 1, ch = 2;
  // please finish the following parts
  while ( ch <= size){//finish this bracket
    if(ch < size && Heap[ch+1] < Heap[ch] ) ch++;
    if(val <= Heap[ch]) break;
    Heap[i] = Heap[ch];
    i = ch;
    ch += ch;
  }
  Heap[i] = val;
  return ret;
}
int n, data1, data2, weight = 0;
int main()
{
    cin >> n;
    for (int i = 0; i < n; i++)
        {int temp;
        cin>>temp;
        insert(temp);}
    for (int i = 0; i < n-1; i++) {
        data1 = delete_min();
        data2 = delete_min();
        weight += data1 + data2;
        insert(data1 + data2);
    }
    cout << weight ;
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-14 14:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表