嚴蔚敏數據結構學習筆記七:圖

在廣度優先搜索的基礎上求圖中兩結點的最短路徑需
1,將鏈隊列的結點改爲“雙鏈”結點,即結點中包含next和priou兩個指針;
2,修改入隊列的操作,插入新的隊尾結點時,令其priou域的指針指向剛剛出隊列的結點,即當前的隊頭指針所指結點;
3,修改出隊列的操作,出隊列時,僅移動隊頭指針,而不將隊頭結點從鏈表中刪除。

由於普里姆算法的時間複雜度爲O( N的平方),則適於稠密圖;而克魯斯卡爾算法需對e條邊按權值進行排序,其時間複雜度爲o(eloge),則適於稀疏圖。

7.5重(雙)連通圖和關節點
若從一個連通圖中刪去任何一個頂點及其相關聯的邊,它仍爲一個連通圖的話,則該連通圖被稱爲重(雙)連通圖。
若連通圖中的某個頂點和其相關聯的邊被刪去之後,該連通圖被分割成兩個或兩個以上的連通分量,則稱此頂點爲關節點。
沒有關節點的連通圖爲雙連通圖。

關節點的特徵:
    假設從某個頂點V出發對連通圖進行深度優先搜索遍歷,則可得到一棵深度優先生成樹,樹上包含圖的所有頂點。
    若生成樹的根結點,有兩個或兩個以上的分支,則此頂點(生成樹的根)必爲關節點;
    對生成樹上的任意一個“頂點”,若其某棵子樹的根或子樹中的其它“頂點”沒有和其祖先相通的回邊,則該“頂點”必爲關節點。

如何求關鍵點:
1)對根結點來說深度優先遍歷看count是否小於結點數,如果小於則該根結點爲關節點。
2)對生成樹上的頂點定義一個函數:
low(v)=Min{visited[v],low[w],visited[k]}(k爲和v有回邊相通的頂點)
對頂點v,若(在生成樹上)存在一個子樹根w,且low[w]>=visited[v]則頂點v爲關節點
對深度優先遍歷算法作如下修改:
1,visited[v]的值改爲遍歷過程中頂點的訪問次序count值
2,遍歷過程中求得
low(v)=Min{visited[v],low[w],visited[k]}
3,從子樹遍歷返回時判別low[v]是否>=visited[v]

7.6兩點之間的最短路徑問題
從源點到其餘各點的最短路徑
算法的基本思想:
依路徑長度遞增的次序求得各條路徑

7.7拓撲排序
如何進行拓撲排序
一,從有向圖中選取一個沒有前驅的頂點(入度爲零的頂點),並輸出之;
二,從有向圖中刪去此頂點以及所有以它爲尾的弧(弧頭頂點的入度減1);
重複上述兩步,直至圖空,或者圖不空但找不到無前驅的頂點爲止。

如何求關鍵活動
“事件(頂點)”的最早發生時間ve(j)=從源點到頂點的最路徑長度;
“事件”的最遲發生時間vl(k)=從頂點k到匯點的最路徑長度;
假設第i條弧爲<j,k>則第i項“活動弧“的最早開始時間ee(i)=ve(j);
"活動(弧)"的最遲開始時間el(i)=vl(k)-dut(<j,k>);

算法的實現要點:
求ve的順序應該是按拓撲有序的次序;而求vl的順序應該是按拓撲逆序的次序;拓撲逆序序列即爲拓撲有序序列的逆序列,因此應該在拓撲排序的過程中,另設一個“棧”記下拓撲有序序列。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章