0# 構造節點鄰接表
st_maps = collections.defaultdict(
list
)for i,
(s, e)
inenumerate
(edges)
: st_maps[s]
(e, succprob[i]))
st_maps[e]
(s, succprob[i]))
ans =
0 queue = collections.deque(
[(start,1)
])visited =
# value為已經遍歷到該節點最大的概率值(還可能存在其他路徑到該節點的概率更大的情況)
while queue:
# 當前節點
cur_node, cur_prob = queue.popleft(
)for next_node, p in st_maps[cur_node]
:# 下乙個待遍歷的節點
next_prob = cur_prob * p
if next_node == end:
ans =
max(ans, next_prob)
continue
if next_prob > ans and
(next_node not
in visited or visited[next_node]
< next_prob)
: visited[next_node]
= next_prob
(next_node, next_prob)
)return ans
class
solution
:def
maxprobability
(self, n:
int, edges, succprob: list[
float
], start:
int, end:
int)
->
float
:# 用於標記節點是否已經訪問過
vis =[0
]* n
# 用於標記已經訪問過的節點個數
cnt =
0import heapq
# 最大堆,用於dijkstra裡每次尋找當前未訪問的節點中最大概率的節點
# 如果用普通佇列,會超時,因為查詢最大的時間複雜度是o(n)
q =(-
1, start)
)# 生成graph,資料格式為:
graph =
for i, item in
enumerate
(edges)
: s, e, p = item[0]
, item[1]
, succprob[i]
graph.setdefault(s,
)(e, p)
) graph.setdefault(e,
)(s, p)
)# 迴圈查詢每個節點
while cnt < n:
# 隊列為空,還沒有找到,說明沒有路徑,即end 和 start 未連通
ifnot q:
return
0# 從最大堆中獲取當前還沒遍歷過的節點裡,概率最大的節點
while vis[maxidx]
:# 如果maxidx不在佇列中 - 說明 start是孤立節點
if maxidx not
in graph:
return
0# 找到終點,結束迴圈
if maxidx == end:
return
-maxprob
# 將該節點設定為已訪問狀態
vis[maxidx]
=true
cnt +=
1# 對於所有鄰居節點,如果沒有被訪問過,放入佇列
for e in graph[maxidx]:if
not vis[e[0]
]:(maxprob * e[1]
, e[0]
))return
0
1
2
再次學習priority queue優先佇列
這周四導師的演算法課就要考試,真心感覺自己沒學好,在看貪心策略的時候提到了哈夫曼編碼,而哈夫曼編碼是借助優先佇列實現的。對於優先佇列並不熟悉的我,理所當然的應該回顧複習乙個priority queue,也就是優先佇列!下面主要是根據 c 標準程式庫 中的內容整理而得到。class priority ...
合併果實 priority queue(優先佇列)
today is a good day!蒟蒻筆記再度更新之 c 優先佇列 priority queue 優先佇列跟普通的佇列唯一的差別呢實際上就在於,他能夠根據所給的某種型別的優先順序規則在訪問之前進行一定的排序工作。具體用途的話 公升序佇列 priority queue greater int q...
隊,棧,優先佇列的操作
隊是先進先出,棧是先進後出,這一點大家應該清楚,明白這一點就可以正確的選擇他們的運用了!使用標準庫的佇列 include 標頭檔案 queueq 定義乙個 int 型的佇列 q.empty 如果隊列為空返回true,否則返回false q.size 返回佇列中元素的個數 q.pop 刪除佇列首元素但...