第五周:堆&哈夫曼树&并查集
题目集总目录 学习指路博客 堆与哈夫曼树与并查集
05-树7 堆中的路径 (25分)
将在“小白专场”中介绍C语言的实现方法,是建立最小堆的基本操作训练,一定要做
题目大意
给出最小堆的插入序列,和下标序列,每个下标i输出Data[i]到根结点路径上的值。
代码
#include <iostream>
using namespace std;
const int mindata = -10005;
const int maxsize = 10000;
typedef struct HeapStruct *MinHeap;
struct HeapStruct {
int *Data;
int Size;
};
MinHeap Create(int maxsize) {
MinHeap H = new HeapStruct;
H->Data = new int[maxsize];
H->Size = 0;
H->Data[0] = mindata;
return H;
}
void Insert(int data, MinHeap H) {
int i;
i = ++H->Size;
for(; H->Data[i>>1] > data; i >>= 1) {
H->Data[i] = H->Data[i>>1];
}
H->Data[i] = data;
}
void PrintPath(int index, MinHeap H) {
bool flag = false;
while(index != 0) {
if(flag) cout << " " << H->Data[index];
else cout << H->Data[index];
flag = true;
index >>= 1;
}
cout << endl;
}
int main() {
MinHeap H = Create(maxsize);
int N, M, x;
cin >> N >> M;
for(int i = 0; i < N; ++i) {
cin >> x;
Insert(x, H);
}
for(int i = 0; i < M; ++i) {
cin >> x;
PrintPath(x, H);
}
return 0;
}测试点
测试点如下

05-树8 File Transfer (25分)
关于并查集,2005、2007年浙江大学计算机学院免试研究生上机考试题即由此题改编而来。“小白专场”中介绍了原始并查集算法的优化,听完课以后自己尝试一下
题目大意
每个样例中,C为查询任意两个计算机是否联通,I为连通这两个计算机,最后S结束后检查是否全部连通,如没有全部不连通则输出有多少个连通的。
思路
并查集+路径压缩
代码
测试点
测试点如下

05-树9 Huffman Codes (30分)
考察对Huffman编码的理解,程序可能略繁,量力而为。 题目大意: 给出若干字符及其频率,判断学生给的编码方式是否为最优编码
思路
看了陈越姥姥的讲解才知道,先根据给定的字符及其频率构建哈夫曼树,得到最优解的WPL(编码长度),再判断学生给的编码,在长度一致的情况下,判断是否为前缀码。这里我用优先队列代替小顶堆的一大串代码,求wpl时用的是另一种方法。


代码
测试点
测试点如下

最后更新于
这有帮助吗?