1. 程式人生 > >圖 Graph-圖的相關算法

圖 Graph-圖的相關算法

ron 獨立 相關 robert color src 有時 是否 路徑問題

2018-03-06 17:42:02

一、最短路問題

問題描述:在網絡中,求兩個不同頂點之間的所有路徑中,邊的權值之和最小的那一條路徑。

  • 這條路徑就是兩點之間的最短路徑 (Shortest Path)
  • 第一個頂點為源點 (Source)
  • 最後一個頂點為終點 (Destination)

問題分類:

  1. 單源最短路徑問題從某固定源點出發,求其到所有其他頂點的最短路徑。
    1. (有向)無權圖
    2. (有向)有權圖
  2. 多源最短路徑問題:求任意兩頂點間的最短路徑。

1)無權圖的單源最短路算法

BFS可以解決這類問題。

技術分享圖片

技術分享圖片

2)有權圖的單源最短路算法

Dijkstra算法可以解決不帶負值邊的單源最短路問題。

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

3)多源最短路算法

此算法由Robert W. Floyd(羅伯特·弗洛伊德)於1962年發表在“Communications of the ACM”上。同年Stephen Warshall(史蒂芬·沃舍爾)也獨立發表了這個算法。Floyd這個牛人是朵奇葩,他原本在芝加哥大學讀的文學,但是因為當時美國經濟不太景氣,找工作比較困難,無奈之下到西屋電氣公司當了一名計算機操作員,在IBM650機房值夜班,並由此開始了他的計算機生涯。

我們來想一想,根據我們以往的經驗,如果要讓任意兩點(例如從頂點a點到頂點b)之間的路程變短,只能引入第三個點(頂點k),並通過這個頂點k中轉即a->k->b,才可能縮短原來從頂點a點到頂點b的路程。那麽這個中轉的頂點k是1~n中的哪個點呢?甚至有時候不只通過一個點,而是經過兩個點或者更多點中轉會更短,即a->k1->k2b->或者a->k1->k2…->k->i…->b。比如上圖中從4號城市到3號城市(4->3)的路程e[4][3]原本是12。如果只通過1號城市中轉(4->1->3),路程將縮短為11(e[4][1]+e[1][3]=5+6=11)。其實1號城市到3號城市也可以通過2號城市中轉,使得1號到3號城市的路程縮短為5(e[1][2]+e[2][3]=2+3=5)。所以如果同時經過1號和2號兩個城市中轉的話,從4號城市到3號城市的路程會進一步縮短為10。通過這個的例子,我們發現每個頂點都有可能使得另外兩個頂點之間的路程變短。

Floyd算法就是首先只允許經過0號結點,看看是否會變短,如果變短就加之修改,然後只允許經過0,1號結點,看看是否變短,加之修改,直到中間結點到達為所有可能的結點。

技術分享圖片

技術分享圖片

二、最小生成樹 (Minimum Spanning Tree)

什麽是最小生成樹?

技術分享圖片

最小生成樹算法使用貪心的思想,每一步都選權重最小的邊。

技術分享圖片

  • Prim算法 — 讓一棵小樹長大

首先隨機選擇起始點,然後不斷將當前結點往外生長,尋找最短的結點加入。

技術分享圖片

  • Kruskal算法 — 將森林合並成樹

技術分享圖片

三、拓撲排序

拓撲序:如果圖中從V到W有一條有向路徑,則V一定排在W之前。滿足此條件的頂點序列稱為一個拓撲序。

獲得一個拓撲序的過程就是拓撲排序

AOV(Activity On Vertex)如果有合理的拓撲序,則必定是有向無環圖(Directed Acyclic Graph, DAG)

技術分享圖片

舉個例子,將計算機學院的課程按照拓撲序進行輸出。

技術分享圖片

技術分享圖片

一種聰明的算法就是將入度為0的結點放到隊列。

技術分享圖片

關鍵路徑問題:

技術分享圖片

技術分享圖片

圖 Graph-圖的相關算法