演算法題 Floyd多源最短路(Python)

2021-10-11 02:10:39 字數 1208 閱讀 6752

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

再給定k個詢問,每個詢問包含兩個整數x和y,表示查詢從點x到點y的最短距離,如果路徑不存在,則輸出「impossible」。

資料保證圖中不存在負權迴路。

輸入格式

第一行包含三個整數n,m,k

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

接下來k行,每行包含兩個整數x,y,表示詢問點x到點y的最短距離。

輸出格式

共k行,每行輸出乙個整數,表示詢問的結果,若詢問兩點間不存在路徑,則輸出「impossible」。

資料範圍

1≤n≤200

1≤k≤n^2

1≤m≤20000

圖中涉及邊長絕對值均不超過10000。

輸入樣例:

3 3 2

1 2 1

2 3 2

1 3 1

2 11 3

輸出樣例:

impossible

1

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

dist = [[float('inf')]*(n+1) for _ in range(n+1)]

for _ in range(m):

x, y, z = map(int, input().split())

dist[x][y] = min(dist[x][y], z)

for i in range(1, n+1):

dist[i][i] = 0

def floyd():

global n

for k in range(1, n+1):

for i in range(1, n+1):

for j in range(1, n+1):

dist[i][j] = min(dist[i][k]+dist[k][j], dist[i][j])

floyd()

for _ in range(k):

x, y = map(int, input().split())

if dist[x][y] == float('inf'): print('impossible')

else: print(dist[x][y])

多源最短路 Floyd演算法

問題的提出 已知乙個有向網 或者無向網 對每一對定點vi vj,要求求出vi與vj之間的最短路徑和最短路徑的長度。解決該問題有以下兩種方法 1 輪流以每乙個定點為源點,重複執行dijkstra演算法或者bellman ford演算法n次,就可以求出每一對頂點之間的最短路徑和最短路徑的長度,總的時間複...

多源最短路演算法 Floyd演算法

我們知道單源最短路是指從某乙個源點到圖中的其它頂點的最短路。多源最短路就是指每乙個點到圖中其他頂點的最短路。那麼有的人肯定想我知道求單源最短路的演算法了,那麼有多少個點我就求多少次唄,這樣做時間效率不高,空間效率也極其低。那麼有什麼演算法求解多源最短路呢?floyd 鄰接矩陣存圖 int dp n ...

多源最短路(floyd)

floyd 就是很簡單很簡單的一種dp 3個for迴圈就出結果 看 就可以知道,floyd就是通過遍歷可能會出現i j比i k k j大的情況,很簡單。貼乙個水題 floyd考的話也是和其他演算法一起考 一般情況下由於floyd的本質,n方的鄰接鍊錶矩陣反而更有效率。include using na...