演算法題 堆優化版本Dijkstra(Python)

2021-10-10 23:07:40 字數 1259 閱讀 2694

給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,所有邊權均為非負值。

請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出-1。

輸入格式

第一行包含整數n和m。

接下來m行每行包含三個整數x,y,z,表示存在一條從點x到點y的有向邊,邊長為z。

輸出格式

輸出乙個整數,表示1號點到n號點的最短距離。

如果路徑不存在,則輸出-1。

資料範圍

1≤n,m≤1.5×10^5

圖中涉及邊長均不小於0,且不超過10000。

輸入樣例:

3 3

1 2 2

2 3 1

1 3 4

輸出樣例:

3
from heapq import *

n, m = map(int, input().split())

idx = 0

h = [-1]*(n+1)

e, ne, w = [0]*(2*m+1), [0]*(2*m+1), [0]*(2*m+1)

st, dist = [false]*(n+1), [float('inf')]*(n+1)

def add(a, b, wei):

global idx

e[idx], w[idx] = b, wei

h[a], ne[idx] = idx, h[a]

idx += 1

def dijkstra():

heap =

dist[1] = 0

while heap:

if st[cur_idx]: continue

st[cur_idx] = true

i = h[cur_idx]

while i != -1:

wei = w[i]

t = e[i]

if dist[t] > dist[cur_idx] + wei:

dist[t] = dist[cur_idx] + wei

i = ne[i]

for _ in range(m):

a, b, wei = map(int, input().split())

add(a, b, wei)

dijkstra()

print(-1) if dist[n] == float('inf') else print(dist[n])

ACM 演算法 堆優化Dijkstra演算法

對於乙個邊權為正的圖,我們可以利用dijkstra演算法求出單源最短路徑 sssp 對於常規的dijkstra演算法,其複雜度為 o n 2 o n 2 o n2 顯然在 n nn 較大的時候,可能導致耗時過長,通過優化我們可以獲得一種更加快速的dijkstra演算法,時間複雜度為 o m logn...

dij演算法堆優化 Floyd演算法

乙個號稱只有5行 的演算法,由1978年圖靈獎獲得者 史丹福大學電腦科學系教授羅伯特 弗洛伊德命名。該演算法有於求乙個帶權有向圖 wighted directed graph 的任意兩點的最短距離的演算法,運用了動態規劃的思想,演算法的時間複雜度為o v 3 空間複雜度o v 2 其核心思想是,在兩...

演算法題一堆

演算法題 說明 這些題就不是什麼花樣了,考的是你的基礎知識怎麼樣。再聰明而沒有實學的人都將會被這些題所淘汰。1.鍊錶和陣列的區別在 2.編寫實現鍊錶排序的一種演算法。說明為什麼你會選擇用這樣的方法?3.編寫實現陣列排序的一種演算法。說明為什麼你會選擇用這樣的方法?4.請編寫能直接實現strstr 函...