我們之前介紹過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始終正確.
演算法通過鄰接矩陣可以簡單地實現:
因為要方便查詢到任意兩點之間的所有邊,所以flo#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;
}
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行...