优先队列

Posted acgame

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了优先队列相关的知识,希望对你有一定的参考价值。

  优先队列是由堆实现的。

技术图片
 1 #include <iostream>
 2 #include <fstream>
 3 #include <string>
 4 
 5 template<typename T>
 6 void swap(T &x, T &y) {
 7     T temp = x;
 8     x = y;
 9     y = temp;
10 }
11 
12 const int inf = (1LL << 31) - 1;
13 const int maxn = 10005;
14 int arr[maxn];
15 int size; 
16 
17 
18 void max_heapinf(int *arr, int i, int length) // 维护堆的性质
19 {
20     int l = 2 * i, r = l + 1;
21     int largest = i;
22     if (l <= length && arr[l] > arr[largest])
23         largest = l;
24     if (r <= length && arr[r] > arr[largest])
25         largest = r;
26     if (largest != i)
27     {
28         swap(arr[largest], arr[i]);
29         max_heapinf(arr, largest, length);
30     }
31 }
32 
33 // 优先队列部分
34 int heap_maximum(int *arr) // 返回队列中具有最大关键字的元素
35 {
36     return arr[1];
37 }
38 
39 int heap_extract_max(int *arr) // 去掉并返回队列中最大关键字的元素
40 {
41     if (size < 1)
42     {
43         std::cout << "heap underflow" << std::endl;
44         return 0;
45     }
46     int ret = arr[1];
47     arr[1] = arr[size--];
48     max_heapinf(arr, 1, size);
49     return ret;
50 }
51 
52 void heap_increase_key(int *arr, int i, int key) //要求 key >= arr[i]
53 {
54     if (key < arr[i])
55     {
56         std::cout << "new key is smaller than current key" << std::endl;
57         return;
58     }
59     arr[i] = key;
60     while (i > 1 && arr[i] > arr[i/2])
61     {
62         swap(arr[i], arr[i / 2]);
63         i /= 2;
64     }
65 }
66 
67 void heap_insert(int *arr, int key)
68 {
69     arr[++size] = -inf;
70     heap_increase_key(arr, size, key);
71 }
72 
73 void print_arr(const int *arr,int l, int r)
74 {
75     for (int i = l; i <= r; ++i)
76         std::cout << arr[i] << " ";
77     std::cout << std::endl;
78 }
79 int main()
80 {
81     for (int i = 1; i <= 10; ++i)
82         heap_insert(arr, i);
83     for (int i = 1; i <= 10; ++i)
84         heap_insert(arr, -i);
85     std::cout << heap_extract_max(arr) << std::endl;
86     heap_increase_key(arr, 3, 100);
87     std::cout << heap_extract_max(arr) << std::endl;
88     return 0;
89 }
View Code

 

以上是关于优先队列的主要内容,如果未能解决你的问题,请参考以下文章

线性表--08---优先队列

优先队列

优先队列实现dijkstra算法C++代码

基础扩展 | 16. 队列应用示例:广度优先搜索

优先队列代码实现

优先队列与堆