程序員利用弗洛伊德算法代碼算出兩點之間最短距離

第二天

小灰的思路如下:

第一步秉犹,利用迪杰斯特拉算法的距離表,求出從頂點A出發(fā)稚晚,到其他各個頂點的最短距離:

第二步崇堵,繼續(xù)使用迪杰斯特拉算法,求出從頂點B出發(fā)客燕,到其他各個頂點的最短距離鸳劳。

小編是一個有著6年工作經驗的工程師,關于C++也搓,編程赏廓,自己有做材料的整合,一個完整的C++編程學習路線傍妒,學習資料和工具幔摸,能夠進我的群7253,-91790收取颤练,免費送給大家既忆,希望你也能憑著自己的努力,成為下一個優(yōu)秀的程序員

第三步嗦玖,從頂點C出發(fā)患雇,到各個頂點的最短距離。

第四步宇挫,從頂點D出發(fā)......

.......

就像這樣庆亡,一直遍歷到頂點G。

這個思路的時間復雜度是多少呢捞稿?

假如圖中有n個頂點又谋,如果不考慮堆優(yōu)化拼缝,一次迪杰斯特拉算法的時間復雜度是O(n^2)。所以彰亥,把每一個頂點都計算一遍咧七,總的時間復雜度是O(n^3)。

————————————

舉一個栗子:

上圖的頂點A和頂點C沒有直接相連的邊任斋,它們之間的直接距離是無窮大继阻。

如果以B作為“中繼頂點”,此時A到C的最短路徑就是A-B-C废酷,最短距離是3+2=5瘟檩。

再舉一個栗子:

上圖的頂點A和頂點C直接相連,距離是6澈蟆。但是存在一條“迂回”路徑A-B-C墨辛,距離是3+2=5<6。

所以趴俘,經過中繼頂點B睹簇,從A到C的最短距離可以是5。

下面我們來看一看Floyd算法的詳細步驟寥闪。

1.要實現(xiàn)Floyd算法太惠,首先需要構建帶權圖的鄰接矩陣:

在鄰接矩陣當中,每一個數(shù)字代表著從某個頂點到另一個頂點的直接距離疲憋,這個距離是沒有涉及到任何中繼頂點的凿渊。

2.此時假定只允許以頂點A作為中繼頂點,那么各頂點之間的距離會變成什么樣子呢缚柳?

B和C之間的距離原本是無窮大埃脏,此時以A為中繼喂击,距離縮短為AB距離+AC距離=

5+2=7。

更新對應矩陣元素(橙色區(qū)域代表頂點A到其他頂點的臨時距離):

3.接下來以頂點A翰绊、B作為中繼頂點,那么各頂點之間的距離會變成什么樣子呢监嗜?

A和D之間的距離原本是無窮大谐檀,此時以B為中繼裁奇,距離縮短為AB距離+BD距離=5+1=6。

A和E之間的距離原本是無窮大刽肠,此時以B為中繼溃肪,距離縮短為AB距離+BE距離=5+6=11免胃。

更新對應矩陣元素(橙色區(qū)域代表頂點B到其他頂點的臨時距離):

4.接下來以頂點A羔沙、B厨钻、C作為中繼頂點,那么各頂點之間的距離會變成什么樣子呢诗充?

A和F之間的距離原本是無窮大诱建,此時以C為中繼,距離縮短為AC距離+CF距離=2+8=10励翼。

更新對應矩陣元素(橙色區(qū)域代表頂點C到其他頂點的臨時距離):

.........

.........

以此類推,我們不斷引入新的中繼頂點抓狭,不斷刷新矩陣中的臨時距離否过。

最終,當所有頂點都可以作為中繼頂點時药磺,我們的距離矩陣更新如下:

此時煤伟,矩陣中每一個元素癌佩,都對應著某頂點到另一個頂點的最短距離围辙。

為什么這么說呢姚建?讓我們回顧一下動態(tài)規(guī)劃的兩大要素:

問題的初始狀態(tài)

問題的狀態(tài)轉移方程式

對于尋找圖的所有頂點之間距離的問題吱殉,初始狀態(tài)就是頂點之間的直接距離厘托,也就是鄰接矩陣催烘。

而問題的狀態(tài)轉移方程式又是什么呢缎罢?

假設新引入的中繼頂點是n,那么:

頂點i 到 頂點j 的新距離 = Min(頂點i 到 頂點j 的舊距離舰始,頂點i 到 頂點n 的距離+頂點n 到 頂點j 的距離)

final

static

int

INF

=

Integer

.

MAX_VALUE

;

public

static

void

floyd

(

int

[][]

matrix

){

//循環(huán)更新矩陣的值

for

(

int

k

=

0

;

k

<

matrix

.

length

;

k

++){

for

(

int

i

=

0

;

i

<

matrix

.

length

;

i

++){

for

(

int

j

=

0

;

j

<

matrix

.

length

;

j

++){

if

(

matrix

[

i

][

k

]

==

INF

||

matrix

[

k

][

j

]

==

INF

)

{

continue

;

}

matrix

[

i

][

j

]

=

Math

.

min

(

matrix

[

i

][

j

],

matrix

[

i

][

k

]

+

matrix

[

k

][

j

]);

}

}

}

// 打印floyd最短路徑的結果

System

.

out

.

printf

(

"最短路徑矩陣:

"

);

for

(

int

i

=

0

;

i

<

matrix

.

length

;

i

++)

{

for

(

int

j

=

0

;

j

<

matrix

.

length

;

j

++)

System

.

out

.

printf

(

"%3d "

,

matrix

[

i

][

j

]);

System

.

out

.

printf

(

"

"

);

}

}

public

static

void

main

(

String

[]

args

)

{

int

[][]

matrix

=

{

{

0

,

5

,

2

,

INF

,

INF

,

INF

,

INF

},

{

5

,

0

,

INF

,

1

,

6

,

INF

,

INF

},

{

2

,

INF

,

0

,

6

,

INF

,

8

,

INF

},

{

INF

,

1

,

6

,

0

,

1

,

2

,

INF

},

{

INF

,

6

,

INF

,

1

,

0

,

INF

,

7

},

{

INF

,

INF

,

8

,

2

,

INF

,

0

,

3

},

{

INF

,

INF

,

INF

,

INF

,

7

,

3

,

0

}

};

floyd

(

matrix

);

}

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末询刹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子沐兰,更是在濱河造成了極大的恐慌蔽挠,老刑警劉巖澳淑,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異量窘,居然都是意外死亡氢拥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門厘线,熙熙樓的掌柜王于貴愁眉苦臉地迎上來出革,“玉大人,你說我怎么就攤上這事耳璧。” “怎么了蹬昌?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵硼砰,是天一觀的道長朋蔫。 經常有香客問我,道長满粗,這世上最難降的妖魔是什么映皆? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮组去,結果婚禮上沟饥,老公的妹妹穿的比我還像新娘贤旷。我一直安慰自己砾脑,他們只是感情好,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布盅藻。 她就那樣靜靜地躺著氏淑,像睡著了一般硕噩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辉懒,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天眶俩,我揣著相機與錄音,去河邊找鬼纲岭。 笑死线罕,一個胖子當著我的面吹牛,可吹牛的內容都是我干的沽翔。 我是一名探鬼主播窿凤,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼雳殊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了座咆?” 一聲冷哼從身側響起仓洼,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤色建,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后某残,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陵吸,經...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡壮虫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了赏酥。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片裸扶。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖魏保,靈堂內的尸體忽然破棺而出摸屠,到底是詐尸還是另有隱情季二,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布刻蚯,位于F島的核電站桑嘶,受9級特大地震影響逃顶,放射性物質發(fā)生泄漏。R本人自食惡果不足惜霸褒,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一妙蔗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦寸五、人聲如沸耿币。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽劲适。三九已至,卻和暖如春烹植,著一層夾襖步出監(jiān)牢的瞬間愕贡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工墩虹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留败晴,地道東北人栽渴。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓闲擦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親纯路。 傳聞我的和親對象是個殘疾皇子寞忿,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內容

  • 1736年腔彰,瑞士數(shù)學家Euler(歐拉)在他的一篇論文中討論了格尼斯七橋問題,由此誕生了一個全新的數(shù)學分支——圖論...
    不困于情閱讀 4,377評論 0 9
  • 所謂的最短路徑搓逾,顧名思義就是帶權值的圖中霞篡,求一個結點到另一個結點的路徑最小。 Dijkstra算法 1.介紹 迪杰...
    放開那個BUG閱讀 1,360評論 1 0
  • 用來求圖中所有點對之間的最短路徑 Dijkstra算法是求單源最短路徑的污淋,那如果求圖中所有點對的最短路徑的話則有以...
    cb_guo閱讀 42,226評論 1 11
  • 分享寸爆, 無意間又打翻到祥林嫂浊吏,就百度把《祝福》仔細看了一遍歌憨,比起上學學的那點摘抄部分的課文墩衙,深刻的多。為祥林嫂難過...
    Dolas閱讀 183評論 0 1
  • 浦江縣浦陽二小教育集團本部六(5)班 何石翰風 一二三四五心铃,我們愛小浦去扣。 水清似朝露樊破,彩虹來常駐。 治水洗故土奔滑,植...
    瀟涵老師閱讀 151評論 0 0