Floyd Warshall 多源最短路演算法

2021-09-22 17:40:07 字數 2186 閱讀 4670

我們之前介紹過dij

kstr

adijkstra

dijkst

ra和b el

lman

−for

d/sp

fabellman-ford/spfa

bellma

n−fo

rd/s

pfa演算法,這些演算法解決的都是單源最短路的問題,那麼有沒有乙個演算法,可以計算出任意兩點之間的最短路呢?答案是–flo

yd−w

arsh

allfloyd-warshall

floyd−

wars

hall

.和所有最短路演算法一樣,flo

yd−w

arsh

allfloyd-warshall

floyd−

wars

hall

演算法也需要借助邊的"鬆弛"操作來縮短最短路徑,不同的是,對於每一條邊,flo

yd−w

arsh

allfloyd-warshall

floyd−

wars

hall

試圖用剩餘的所有頂點作為中間點去鬆弛,這樣得到的就會是任意兩點間的最短路徑.關於這個演算法的正確性,簡單說明一下:

假設兩個點之間沒有邊,通過中間點建立一條邊,顯然這兩點的最短路縮短了;

假設兩個點有邊,通過若干個中間點縮短了最短路徑,則設該圖含有v

vv個頂點,可得兩點之間最多通過v−2

v-2v−

2個中間點縮短最短路徑,此時路徑包含v−1

v-1v−

1條邊,顯然在不包含負環的圖中,最短路不可能包括比這更多的邊數,因此最多通過v−2

v-2v−

2個點鬆弛;

在圖中若存在負環,則2不成立,但此時也會不存在最短路徑,因此在有解的情況下1,2始終正確.

演算法通過鄰接矩陣可以簡單地實現:

#include

#define maxn 10000

#define inf 0x3f3f3f3f

using

namespace std;

int e[maxn]

[maxn]

;void

init

(int n)}}

void

floyd_warshall

(int n)}}

}int

main()

floyd_warshall

(n);

for(

int i =

0; i <= n; i++

) cout<

return0;

}

因為要方便查詢到任意兩點之間的所有邊,所以flo

yd−w

arsh

allfloyd-warshall

floyd−

wars

hall

演算法最理想的實現方式就是鄰接矩陣,如果要用鄰接表實現,需要有兩個鄰接表,乙個是入邊表,乙個是出邊表,並且要維護每乙個公共中間點的入邊和出邊的關係,這樣的寫法不但複雜,而且沒有意義,時間和空間都沒有太大的提公升,因此只介紹鄰接矩陣實現.

顯然,flo

yd−w

arsh

allfloyd-warshall

floyd−

wars

hall

的時間複雜度是o(v

3)o(v^3)

o(v3

),這是乙個很高的時間複雜度,但是考慮到求得任意兩點之間的最短路徑,這個時間複雜度是可以接受的.

多源對多源最短路徑

魔方國有n座城市,編號為1 sim n1 n。城市之間通過n 1條無向道路連線,形成乙個樹形結構。在若干年之後,其中p座城市發展成了大都會,道路的數量也增加到了m條。大都會之間經常有 往來,因此,對於每座大都會,請你求出它到離它最近的其它大都會的距離。蒟蒻第一次見多源對多源最短路,沒想到是這種處理方...

多源資訊融合

現代化戰爭中的多感測器資訊融合技術研究 牛志一摘要 資訊融合是對現代化資訊戰爭具有重要意義的一門新型學科。本文介紹了多感測器資訊融合的定義 原理 方法 層次和結構,提出了現代化戰場資訊融合系統作戰體系結構和功能體系結構,對多感測器資訊融合系統技術進行了較為全面的 1 引言 現代科學技術在軍事領域的廣...

多源最短路

題目描述 已知n個點 n 100 給你n n的方陣,a i,j 表示從第i個點到第j個點的直接距離。現在有q個詢問,每個詢問兩個正整數,a和b,讓你求a到b之間的最短路程。滿足a i,j a j,i 輸入描述 第一行乙個正整數n,接下來n行每行n個正整數,滿足a i,i 0,再一行乙個q,接下來q行...