校園導航

校園導航這個課題浑槽,分別可以使用了Dijkstra(迪杰斯特拉)算法蒋失,F(xiàn)loyd(弗洛伊德)算法和Bellman-Ford算法。這三種算法都是為了解決求兩點之間最短路徑的問題桐玻。

接下來給大家分享我們理解的這三種算法。

一. Dijkstra(迪杰斯特拉)算法

?? 有人把他規(guī)劃在貪心模式算法中嫉髓,也有人把他劃在動態(tài)規(guī)劃算法中,但我覺得說法各有千秋算行。

Dijkstra算法按路徑長度遞增次序產(chǎn)生最短路徑苫耸,首先假設V是所有路徑頂點的集合,再引入兩個集合褪子,分別是

S:已求出最短路徑的頂點的集合

T=V-S:尚未確定最短路徑的頂點的集合

將T中頂點按最短路徑遞增的次序加入到S中,依據(jù):可以證明V0到T中頂點Vk的最短路徑呀枢,或是從V0到Vk的直接路徑的權(quán)值或是從V0經(jīng)S中頂點到Vk的路徑權(quán)值之和笼痛。聽不懂吧,接下來我們來舉個例子缨伊。


我們要用一個二維數(shù)組來記錄各個頂點之間邊的關系刻坊,我們把不能直接到達的兩點之間的距離用∞(一個很大很大的數(shù))來表示


首先要先確定一個點,我們暫且叫它源點徐块,我們接下來求的也是源點到其它各個點的最短路徑灾而,在這里我們把1號點設為源點。然后我們還需要一個一維數(shù)組dis記錄當前情況下源點到其他各個點的最短距離绰疤,并不是真的最短距離,我們把它叫做最短距離的“估計值”


拋去1號點到1號點的距離是0外(因為我們可以確定)癣猾,讓我們選出當前情況下距離1號點最近的點,就是2號點纷宇。然后我們就可以把1號點到2號點的最短距離從“估計值”變?yōu)椤按_定值”,即1號頂點到2號頂點的最短路程就是當前dis[2]值上陕。為什么呢拓春?你想啊,目前離1號頂點最近的是2號頂點硼莽,并且這個圖所有的邊都是正數(shù),那么肯定不可能通過第三個頂點中轉(zhuǎn)偏螺,使得1號頂點到2號頂點的路程進一步縮短了匆光。因為1號頂點到其它頂點的路程肯定沒有1號到2號頂點短。

然后我們就來看看剛被我們確定的2號點能直接到哪幾個點吧终息,可以看出能直接到3號點和4號點。先討論通過2->3這條邊能否讓1號頂點到3號頂點的路程變短劲够。也就是說現(xiàn)在來比較dis[3]和dis[2]+e[2][3]的大小休傍。其中dis[3]表示1號頂點到3號頂點的路程蹲姐。dis[2]+e[2][3]中dis[2]表示1號頂點到2號頂點的路程,e[2][3]表示2->3這條邊柴墩。所以dis[2]+e[2][3]就表示從1號頂點先到2號頂點,再通過2->3這條邊逢净,到達3號頂點的路程。我們發(fā)現(xiàn)dis[3]=12爹土,dis[2]+e[2][3]=1+9=10,dis[3]>dis[2]+e[2][3]胀茵,因此dis[3]要更新為10。同理我們的dis[4]也要從∞(一個很大很大的數(shù))被更新為4峭弟。

雖然dis[3]和dis[4]都被更新了脱拼,但先別急,它們現(xiàn)在仍是“估計值”還不是“確定值”情臭。讓我們想一想現(xiàn)在被確定的點有哪些玉组?(一個是1號點)一個是2號點。這些確定的點就不用管了惯雳,讓我們在那些還是估計值的點中選出當前情況下距離1號點最近的點,


就是4號點劈猿。然后我們就可以把1號點到4號點的最短距離從“估計值”變?yōu)椤按_定值”潮孽,即1號頂點到4號頂點的最短路程就是當前dis[4]值。

然后我們再來看看剛被我們確定的4號點能直接到哪幾個點吧往史,可以看出能直接到3號點、5號點挨决、6號點订歪。同樣用剛才的方法去更新1號點(源點)到這三個點的最短距離即dis數(shù)組中的值。


雖然dis[3]盖高、dis[5]和dis[6]都被更新了慎陵,但先別急喻奥,它們現(xiàn)在仍是“估計值”還不是“確定值”。讓我們想一想現(xiàn)在被確定的點有哪些胆筒?一個是2號點诈豌、一個是4號點。這些確定的點就不用管了矫渔,讓我們在那些還是估計值的點中選出當前情況下距離1號點最近的點,


就是3號點顿痪。然后我們就可以把1號點到3號點的最短距離從“估計值”變?yōu)椤按_定值”油够,即1號頂點到3號頂點的最短路程就是當前dis[3]值。

.........

.........

直到dis數(shù)組中的值都變成確定值揩悄。


下面給大家分享一下我們的核心的代碼

核心代碼


最后鬼悠,提醒大家,Dijkstar算法不能處理負權(quán)邊焕窝,每次都找一個距源點最近的點dmin,然后將改距離定為這個點到源點的最短距離巴帮,但如果存在負權(quán)邊虐秋,那有可能先通過并不是距源點最近的一個次優(yōu)點(dmin’),再通過這個負權(quán)邊L(L<0)熟妓,使得路徑之和更小栏尚。則dmin’+L成為最短路徑,并不是dmin抬虽,這樣dijkstra就被pass掉了。


二. Floyd算法

?? 基本思想是阐污,兩點的最短路徑不外乎有兩種可能,一種是直接最短功氨,第二種是經(jīng)過若干點最短手幢。所以,我們假設dist(AB)為節(jié)點A到節(jié)點B的最短路徑的距離围来,對于每個節(jié)點K,我們檢查dist(Ak)+dist(KB)

代碼只有短短幾行:

for (intk=0; k

? for (inti=0; i

??? for (intj=0; j

????? if(dist[i][k] + dist[k][j] < dist[i][j] ) {

??????? dist[i][j] = dist[i][k] + dist[k][j];

????? }

??? }

? }

}

最后桶错,注意的是胀蛮,我們要注意循環(huán)的嵌套順序,如果把把檢查所有節(jié)點的K放在內(nèi)層醇滥,那么結(jié)果就是不正確的。因為這樣就提前把最短路徑確定下來了阅虫,當后面存在最短路徑時也不會再更新了不跟。

三.Bellman-Ford算法

Bellman-ford算法是求含負權(quán)圖的單源最短路徑算法,效率很低窝革,但代碼很容易寫。即進行不停地松弛瘪板,每次松弛把每條邊都更新一下漆诽,若n-1次松弛后還能更新锣枝,則說明圖中有負環(huán),無法得出結(jié)果撇叁,否則就成功完成畦贸。Bellman-ford算法有一個小優(yōu)化:每次松弛先設一個flag,初值為FALSE薄坏,若有邊更新則賦值為TRUE,最終如果還是FALSE則直接成功退出觅廓。

dist 1 [u] =

Edge[v][u]


dist k [u] = min{ dist k-1 [u], min{ dist k-1 [j] + Edge[j][u] } },

j=0,1,…,n-1,j≠u

Dijkstra算法和Bellman算法思想有很大的區(qū)別:Dijkstra算法在求解過程中涵但,源點到集合S內(nèi)各頂點的最短路徑一旦求出,則之后不變了矮瘟,修改? 的僅僅是源點到T集合中各頂點的最短路徑長度。Bellman算法在求解過程中劫侧,每次循環(huán)都要修改所有頂點的dist[ ]哨啃,也就是說源點到各頂點最短路徑長度一直要到Bellman算法結(jié)束才確定下來。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末审姓,一起剝皮案震驚了整個濱河市祝峻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌莱找,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辞色,死亡現(xiàn)場離奇詭異浮定,居然都是意外死亡诱篷,警方通過查閱死者的電腦和手機雳灵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門闸盔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人躲撰,你說我怎么就攤上這事击费。” “怎么了蔫巩?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵圆仔,是天一觀的道長。 經(jīng)常有香客問我坪郭,道長,這世上最難降的妖魔是什么歪沃? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任沪曙,我火速辦了婚禮,結(jié)果婚禮上珊蟀,老公的妹妹穿的比我還像新娘。我一直安慰自己腻窒,他們只是感情好磅崭,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著柔逼,像睡著了一般蒋譬。 火紅的嫁衣襯著肌膚如雪愉适。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天剂买,我揣著相機與錄音癌蓖,去河邊找鬼。 笑死坐慰,一個胖子當著我的面吹牛用僧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播永毅,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼着逐!你這毒婦竟也來了意蛀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤秀姐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后省有,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谴麦,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年舷蟀,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扫步。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡匈子,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出旬牲,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布擂橘,位于F島的核電站,受9級特大地震影響通贞,放射性物質(zhì)發(fā)生泄漏恼五。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一茎用、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧轨功,春花似錦容达、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柒昏。三九已至也祠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間诈嘿,已是汗流浹背削葱。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工淳梦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人爆袍。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓陨囊,卻偏偏與公主長得像弦疮,于是被迫代替她去往敵國和親蜘醋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 介紹 學習了數(shù)據(jù)結(jié)構(gòu)課程中的一些簡單的數(shù)據(jù)結(jié)構(gòu)之后,用C語言和數(shù)據(jù)結(jié)構(gòu)中的一些知識實現(xiàn)一個簡易的學校的導航系統(tǒng)胎食。 ...
    花不休閱讀 1,759評論 0 3
  • 參見貪心算法——最短路徑Dijkstra算法參見動態(tài)規(guī)劃 目錄 0.最短路徑問題0.1 最短路徑問題描述?0.1....
    王偵閱讀 4,798評論 1 9
  • 一厕怜、定義 在一幅加權(quán)有向圖中,最短路徑是指從頂點s到頂點t的最短路徑是所有從s到t的路徑中的權(quán)重最小者酣倾。求解最短路...
    null12閱讀 2,454評論 0 4
  • 如果你能心靜地直面他的眼睛,那么兩個內(nèi)心世界從此開始融合拦焚。 工作上的男女關系杠输,只能是停留在不敢直視的開玩笑上面。雖...
    喬遲語閱讀 696評論 0 0
  • Reveal News 從事并通過新聞調(diào)查來報道搞糕,以改善人們的生活和自我保護的意識勇吊,提高公眾安全,該網(wǎng)站成立于19...
    電游女王閱讀 129評論 0 0