【圖論】Floyd演算法

purinliang發表於2024-04-04

原本不想寫這個的,但是今天錯了一次。寫一下讓自己以後多一個參考。

Floyd演算法初始化兩點之間的距離為無窮大,然後自己到自己的距離為0。

然後列舉所有的邊,初始化對應兩點的邊權,注意處理平行邊或者自環的情況。推薦用min操作。

第一維列舉中轉點k,也就是階段。
第二第三維列舉圖中的兩點i, j,也就是狀態。

時間複雜度 \(O(n^3)\)

INF = 10**18
dis = [[INF for _ in range(n)] for _ in range(n)]
for i in range(n):
  dis[i][i] = 0

for u, v, w in edges:
  dis[u][v] = min(dis[u][v], w)
  # dis[v][u] = min(dis[v][u], w)

for k in range(n):
  for i in range(n):
    for j in range(n):
      dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j])

print(dis)

相關文章