1. 程式人生 > >第9章 圖論演算法

第9章 圖論演算法

圖的表示方法

  • 鄰接矩陣 : adjacent matrix是一個二位陣列,對於每條邊(u,v),置A[u][v]等於true;否則,陣列的元素就是false。如果邊有一個,那麼可以置A[u][v]等於該權,而使用一個很大或者很小的權作為標記表示不存在的邊。適用於稠密的圖
  • 鄰接表 : adjacent list對於每一個頂點,我們使用一個表存放所有鄰接的頂點。空間需求為O(|E| + |V|)

有關圖的演算法

  • 拓撲排序 : 是對有向無權圖的頂點的一種排序,使得如果存在一條從vi到vj的路徑,那麼在排序中vj就出現在vi的後面。
  • 廣度優先搜尋
    : 該方法按層處理頂點,距開始點最近的那些頂點首先被求值,而最遠的那些頂點最後被求值。常用於求解有向無權最短路徑問題
  • Dijkstra演算法 : 解決單源s最短路徑問題,是一種貪婪演算法,(也是基於廣度優先搜尋,每次遍歷更新被遍歷節點子節點到s的距離:一開始為無窮,子節點可能被其它父節點更新過、這時取最小值即可)

最小生成樹

  • 問題 : 一個無向圖G的最小生成樹就是由該圖的那些連線G的所有頂點的邊構成的樹,且其總價值要最低
  • 總結 : 邊的條數**|V|-1**;它包含每一個頂點,所以它是生成樹
  • Prim演算法 : 貪婪演算法,選擇邊(u,v)使得(u,v)的值是所有u在樹上
    v不在樹上的邊值最小者,直到剩餘的點為空
  • Kruskal演算法 : 貪婪演算法,連續地按照最小的權選擇邊,並且當所選的邊不產生圈時就把它作為所取定的邊。

深度優先搜尋

  • 思想 : 是先序遍歷的推廣,需要小心避免圈的出現(導致死迴圈),標記已經訪問過的節點,並且對於尚未被標記的所有鄰接頂點遞迴呼叫深度優先搜尋。
  • 時間複雜度 : 如果使用鄰接表,則執行遍歷的總時間就是O(|E|+|V|)

術語

  • 雙連通性 : 一個連通的無向圖如果不存在被刪除之後使得剩下的圖不再連通的頂點,那麼這樣的無向連通圖就稱為雙連通
  • 歐拉回路 : 在圖中找到一條路徑,使得該路徑訪問圖的每條邊恰好一次。