Swift最短路徑之Floyd-Warshall算法

Floyd-Warshall算法败匹,簡(jiǎn)稱Floyd算法巢株,用于求解任意兩點(diǎn)間的最短距離。如下圖恢口,表示一個(gè)用鄰接矩陣表示的圖聂渊,如何求任意兩點(diǎn)之間的距離呢差购?


floyd.png
  • 當(dāng)任意兩點(diǎn)之間不允許經(jīng)過第三個(gè)點(diǎn)時(shí),這些點(diǎn)之間的最短距離就是初始距離汉嗽。

  • 第一步:只允許經(jīng)過0號(hào)頂點(diǎn)欲逃,求任意兩點(diǎn)之間的最短路程。這時(shí)候只需要判斷map[i][0] + map[0][j] 是否比map[i][j]要小即可饼暑。map[i][j]表示從i號(hào)頂點(diǎn)到j(luò)號(hào)頂點(diǎn)之間的路程稳析,map[i][0] + map[0][j]表示的是從i號(hào)頂點(diǎn)先到0號(hào)頂點(diǎn),再從0號(hào)頂點(diǎn)到j(luò)號(hào)頂點(diǎn)的路程之和弓叛。代碼如下:
    <pre>
    //經(jīng)過0號(hào)頂點(diǎn)
    for i in 0..<map.count {
    for j in 0..<map.count {
    if map[i][j] > (map[i][0] + map[0][j]) {
    map[i][j] = (map[i][0] + map[0][j])
    }
    }
    }
    </pre>

  • 第二部:在第一步的基礎(chǔ)上彰居,只允許經(jīng)過1號(hào)頂點(diǎn)
    <pre>
    //經(jīng)過1號(hào)頂點(diǎn)
    for i in 0..<map.count {
    for j in 0..<map.count {
    if map[i][j] > (map[i][1] + map[1][j]) {
    map[i][j] = (map[i][1] + map[1][j])
    }
    }
    }
    </pre>

  • 以此類推,最后允許通過所有的頂點(diǎn)作為中轉(zhuǎn)撰筷,就能得出任意兩點(diǎn)之間的最短路程陈惰。Floyd-Warshall算法的核心代碼只有以下五行!
    <pre>
    for k in 0..<map.count {
    for i in 0..<map.count {
    for j in 0..<map.count {
    if map[i][j] > (map[i][k] + map[k][j]) {
    map[i][j] = (map[i][k] + map[k][j])
    }
    }
    }
    }
    </pre>

  • 完整代碼如下:

<pre>
let max:Int = 10000 //用來表示最大值∞毕籽,表示兩個(gè)頂點(diǎn)之間無邊
var map = [[0, 2, 6, 4],
[max, 0, 3, max],
[7, max, 0, 1],
[5, max, 12, 0]]

func floyd(map: inout [Array<Int>]) {
for k in 0..<map.count {
for i in 0..<map.count {
for j in 0..<map.count {
if map[i][j] > (map[i][k] + map[k][j]) {
map[i][j] = (map[i][k] + map[k][j])
}
}
}
}
}
floyd(map: &map)
print(map) //[[0, 2, 5, 4], [9, 0, 3, 4], [6, 8, 0, 1], [5, 7, 10, 0]]
</pre>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抬闯,一起剝皮案震驚了整個(gè)濱河市井辆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌溶握,老刑警劉巖杯缺,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異睡榆,居然都是意外死亡萍肆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門肉微,熙熙樓的掌柜王于貴愁眉苦臉地迎上來匾鸥,“玉大人蜡塌,你說我怎么就攤上這事碉纳。” “怎么了馏艾?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵劳曹,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我琅摩,道長(zhǎng)铁孵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任房资,我火速辦了婚禮蜕劝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘轰异。我一直安慰自己岖沛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布搭独。 她就那樣靜靜地躺著婴削,像睡著了一般。 火紅的嫁衣襯著肌膚如雪牙肝。 梳的紋絲不亂的頭發(fā)上唉俗,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音配椭,去河邊找鬼虫溜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛股缸,可吹牛的內(nèi)容都是我干的吼渡。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼乓序,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼寺酪!你這毒婦竟也來了坎背?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤寄雀,失蹤者是張志新(化名)和其女友劉穎得滤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盒犹,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡懂更,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了急膀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沮协。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖卓嫂,靈堂內(nèi)的尸體忽然破棺而出慷暂,到底是詐尸還是另有隱情,我是刑警寧澤晨雳,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布行瑞,位于F島的核電站,受9級(jí)特大地震影響餐禁,放射性物質(zhì)發(fā)生泄漏血久。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一帮非、第九天 我趴在偏房一處隱蔽的房頂上張望氧吐。 院中可真熱鬧,春花似錦末盔、人聲如沸筑舅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽豁翎。三九已至,卻和暖如春隅忿,著一層夾襖步出監(jiān)牢的瞬間心剥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來泰國打工背桐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留优烧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓链峭,卻偏偏與公主長(zhǎng)得像畦娄,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

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

  • [編程題]比較重量小明陪小紅去看鉆石熙卡,他們從一堆鉆石中隨機(jī)抽取兩顆并比較她們的重量杖刷。這些鉆石的重量各不相同。在他們...
    駭客與畫家閱讀 823評(píng)論 0 0
  • 最短路徑算法在現(xiàn)實(shí)生活中也具有非常多的應(yīng)用驳癌,例如在一個(gè)復(fù)雜的景區(qū)滑燃,想要從一個(gè)景點(diǎn)到另外一個(gè)景點(diǎn),利用最短路徑算法就...
    鄭明明閱讀 1,839評(píng)論 0 6
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)颓鲜。 張土汪:刷leetcod...
    土汪閱讀 12,748評(píng)論 0 33
  • Floyd 算法 簡(jiǎn)介 Floyd 算法又稱為插點(diǎn)法表窘,是一種利用動(dòng)態(tài)規(guī)劃的思想尋找給定的加權(quán)圖中多源點(diǎn)之間最短路徑...
    廖少少閱讀 8,551評(píng)論 0 1
  • 很多同學(xué)都有跑步、健身或者乘坐交通工具時(shí)甜滨,聽音樂的習(xí)慣乐严,也有瀏覽網(wǎng)頁文章時(shí)先收藏后閱讀的習(xí)慣。作為重度的時(shí)間管理強(qiáng)...
    知行日程閱讀 19,960評(píng)論 0 3