Dijkstra演算法 python實現

2022-07-20 03:54:12 字數 2648 閱讀 5919

簡介:

dijkstra演算法是從乙個頂點到其餘各頂點的最短路徑演算法,解決的是有權圖中最短路徑問題。迪傑斯特拉演算法主要特點是從起始點開始,採用貪心演算法的策略,每次遍歷到始點距離最近且未訪問過的頂點的鄰接節點,直到擴充套件到終點為止。

演算法介紹推薦文章:

假設有圖g:

則g的帶權鄰接矩陣為:

matrix = [

[99, 2, 99, 6, 99, 9, 99, 99],

[99, 99, 30, 1, 99, 99, 99, 99],

[99, 99, 99, 99, 99, 99, 99, 5],

[99, 99, 99, 99, 2, 99, 99, 99],

[99, 99, 8, 99, 99, 99, 7, 99],

[99, 99, 99, 99, 3, 99, 24, 99],

[99, 99, 99, 99, 99, 99, 99, 21],

[99, 99, 99, 99, 99, 99, 99, 99]]

則時間複雜度為\(o\left( n^2 \right)\)的演算法如下圖(python語言):

n = len(matrix) # 計算頂點數量

# v記錄是否訪問

# dis為起始結點到相鄰結點的距離

v = [0]*n

dis = matrix[0].copy()

# 起始情況

v[0] = 1

dis[0] = 99

# 迴圈n次

for _ in range(n):

# 找出與集合相鄰且距離起點最近的點

k = 0

for j in range(n):

if v[j] == 0 and dis[j] < dis[k]:

k = j

# 該點被訪問

v[k] = 1

# 用該點進行鬆弛(relax)

for j in range(n):

if v[j] == 0 and dis[k] + matrix[k][j] < dis[j]:

dis[j] = dis[k] + matrix[k][j]

結果:dis = [99, 2, 13, 3, 5, 9, 12, 18]

class graph:

def __init__(self):

self.v =

self.w = {}

class vertex:

def __init__(self, x):

self.key = x

self.color = 'white'

self.d = 10000

self.pi = none

self.adj =

class solution():

def initializesinglesource(self, g, s):

for v in g.v:

v.d = 10000

v.pi = none

s.d = 0

def relax(self, u, v, w):

if v.d > u.d + w[(u, v)]:

v.d = u.d + w[(u, v)]

v.pi = u

def dijkstra(self, g, w, s):

self.initializesinglesource(g, s)

s = set()

q = g.v[:]

while q:

u = self.extractmin(q, s)

s.add(u)

for v in u.adj:

self.relax(u, v, w)

def extractmin(self, q, s):

q.sort(key=lambda v: v.d)

return q.pop(0)

if __name__ == '__main__':

s = vertex('s')

t = vertex('t')

y = vertex('y')

x = vertex('x')

z = vertex('z')

s.adj = [t, y]

y.adj = [t, z, x]

t.adj = [x, y]

x.adj = [z]

z.adj = [x, s]

g = graph()

g.v = [s, t, y, x, z]

g.w =

m = solution()

m.dijkstra(g, g.w, s)

for v in g.v:

if v != s:

print v.key, v.d, v.pi.key

else:

print v.key, v.d, v.pi

演算法 Dijkstra演算法筆記

參考文章 隨記參考邏輯 dijkstra演算法採用的是一種貪心的策略。演算法的基本思想是 通過不斷更新的距離陣列,每次從距離陣列找到離源點最近的乙個且沒有掃瞄過的節點,然後以該頂點為中心進行bfs擴充套件,直到所有節點都掃瞄一遍,最終得到源點到其餘所有點的最短路徑 1 起點固定,若要記錄到達路徑,則...

日日演算法 Dijkstra演算法

dijistra演算法作為一種最短路徑演算法,可以用來計算乙個節點到圖上其他節點的最短距離。主要是通過啟發式的思想,由中心節點層層向外拓展,直到找到中點。適用於無向圖和有向圖。假設我們要計算節點a到其它節點的最短距離 引入兩個集合 s,u 其中集合s表示已經求出最短路徑的點 以及最短距離 集合u表示...

(二)Dijkstra演算法

ifndef dijkstra define dijkstra include using namespace std void testdijstra const int max node 1000 最簡單的 用二維陣列來記錄graph和weight 斐波那契堆實現 insert,get 1.最普...