1. 程式人生 > >關於需要記錄路徑的最短路(弗洛伊德)

關於需要記錄路徑的最短路(弗洛伊德)

弗洛伊德用來求單、多源最短路都很常見,然而有些題一定要記錄路徑,很煩,不會的又重新用暴力,爆零也很常見。


真是氣skr人。


其實,時間複雜的確實會比較高,但是也比暴力好,是O(n^3+
n^4)。

首先,還是要走一遍弗洛伊德,記錄最優解。這裡O(n^3);


簡單粗暴


之後,我們可以列舉每一個點,每一次都走一遍弗洛伊德,判斷是否是路徑點,唯一區別,每一個點(起點,終點,中間點)都不能是列舉的點,這樣,就能找出沒有這個點是否影響答案(即大/小於最優解),如果影響就證明此點必走,記錄答案。時間O(n^4)
[列舉n*弗洛伊德n^3]

例題(大家可以試做一下):
在這裡插入圖片描述


輸入
第一行兩個整數 N,M,表示點數和邊數。
接下來一行 N 個整數,第 i 個正整數表示 Pi。
接下來 M 行,每行兩個整數 u,v,表示有一條無向邊連線了 u 和 v。

輸出
輸出 N 行,每行為一個 0 或 1,意義如題目描述所示。

樣例輸入
7 8
1 50 49 10 90 90 1
1 2
1 3
2 4
3 4
4 5
4 6
5 7
6 7

樣例輸出
1
0
1
1
0
0
1

在這裡插入圖片描述