函式名功能
void insert(int k,key key)
插入元素key,並和索引k關聯
void change(int k,key key)
將索引為k的值改為key
void delmin()
刪除最小元素並返回索引
key min()
返回最小元素
void contains(int k)
是否包含索引k
#pragma once
#include
#include
#include
using
namespace std;
#define out(x) cout
<
class
key>
class
indexminpq
intsize()
bool
contains
(int k)
intminindex()
key keyof
(int k)
key min()
;int
delmin()
;void
change
(int k, key key)
;void
insert
(int i, key key)
;void
remove
(int k)
;private
:int m_maxn =0;
int m_n =0;
vector<
int>
* m_pq =
nullptr
;//儲存索引,二叉堆,從一開始
vector<
int>
* m_qp =
nullptr
;//逆序,qp[pq[i]]=pq[qp[i]]=i
vector
* m_keys =
nullptr
;//儲存元素
void
sink
(int k)
;//下沉
void
swim
(int k)
;//上浮
bool
less
(int x,
int y)
;//y是否小於x
void
exch
(int x,
int y)
;bool
greater
(int i,
int j)
;//x是否大於y
void
validateindex
(int idx);}
;void
test_indexminpq()
;
#include
"indexminpq.h"
template
<
class
key>
inline indexminpq
::indexminpq
(int maxn)
m_maxn = maxn;
m_n =0;
//佇列中元素個數
m_keys =
new vector
(maxn +1)
; m_pq =
new vector<
int>
(maxn +1)
; m_qp =
new vector<
int>
(maxn +1)
;//不要0位置
for(
int i =
1; i <= maxn;
++i)
}template
<
class
key>
void indexminpq
::insert
(int i, key key)
m_n++
;//加到末尾,並上浮
m_qp-
>
at(i)
= m_n;
m_pq-
>
at(m_n)
= i;
m_keys-
>
at(i)
= key;
swim
(m_n);}
template
<
class
key>
key indexminpq
::min()
template
<
class
key>
int indexminpq
::delmin()
int min = m_pq-
>at(
1);exch(1
, m_n--);
sink(1
);//assert(min == m_pq[m_n + 1]);
m_qp-
>
at(min)=-
1;m_keys-
>
at(min)
=key()
; m_pq-
>
at(m_n +1)
=-1;
return min;
}template
<
class
key>
void indexminpq
::change
(int i, key key)
m_keys-
>
at(i)
= key;
swim
(m_qp-
>
at(i));
sink
(m_qp-
>
at(i));
}template
<
class
key>
void indexminpq
::sink
(int k)
}template
<
class
key>
void indexminpq
::swim
(int k)
}template
<
class
key>
void indexminpq
::exch
(int x,
int y)
template
<
class
key>
bool indexminpq
::greater
(int i,
int j)
template
<
class
key>
bool indexminpq
::less
(int x,
int y)
template
<
class
key>
void indexminpq
::validateindex
(int idx)
}void
test_indexminpq()
; indexminpq<
double
>
minpq(9
);for(
int i =
0; i <4;
++i)
out(minpq.
min())
, hh;
minpq.
change(3
,2.09);
out(minpq.
min())
, hh;
minpq.
change(4
,1.89);
out(minpq.
min())
, hh;
}int
main()
C 優先佇列
半題外話 優先佇列個人認為主要優點是可以在排序後進行類似於插入排序的操作,適合於需要在陣列排序後再次進行操作的題目 再由此產生一堆bug 本蒟蒻是在敲貪心的題時遇見的 弱得連個貪心都不會敲了呵 就開始了學 mo 習 ca 之旅 優先佇列的結構 佇列1.back 返回乙個引用,指向最後乙個元素 2.e...
c 優先佇列
優先佇列容器與佇列一樣,只能從隊尾插入元素,從隊首刪除元素。但是它有乙個特性,就是佇列中最大的元素總是位於隊首,所以出隊時,並非按照先進先出的原則進行,而是將當前佇列中最大的元素出隊。這點類似於給佇列裡的元素進行了由大到小的順序排序。元素的比較規則預設按元素值由大到小排序,可以過載 操作符來重新定義...
優先佇列 c
1.標頭檔案 include queue 2.定義 優先佇列和佇列一樣,只能從隊尾插入元素,從隊首刪除元素。佇列中最大的元素總是位於隊首。可以通過過載 運算子來重新定義比較規則。3.訪問 和佇列不同,優先佇列沒有front 和back 函式,只能通過 top 來訪問隊首元素 堆頂元素,優先順序最高的...