數據結構之—圖

1.圖的兩種遍歷方法:
1) 深度優先搜索遍歷

深度優先搜索DFS遍歷類似於樹的前序遍歷。其基本思路是:

a) 假設初始狀態是圖中所有頂點都未曾訪問過,則可從圖G中任意一頂點v爲初始出發點,首先訪問出發點v,並將其標記爲已訪問過。

b) 然後依次從v出發搜索v的每個鄰接點w,若w未曾訪問過,則以w作爲新的出發點出發,繼續進行深度優先遍歷,直到圖中所有和v有路徑相通的頂點都被訪問到。

c) 若此時圖中仍有頂點未被訪問,則另選一個未曾訪問的頂點作爲起點,重複上述步驟,直到圖中所有頂點都被訪問到爲止。

                                                              

2) 廣度優先搜索遍歷

廣度優先搜索遍歷BFS類似於樹的按層次遍歷。其基本思路是:

a) 首先訪問出發點Vi

b) 接着依次訪問Vi的所有未被訪問過的鄰接點Vi1,Vi2,Vi3,…,Vit並均標記爲已訪問過。

c) 然後再按照Vi1,Vi2,… ,Vit的次序,訪問每一個頂點的所有未曾訪問過的頂點並均標記爲已訪問過,依此類推,直到圖中所有和初始出發點Vi有路徑相通的頂點都被訪問過爲止。



如果採用鄰接矩陣存儲,則時間複雜度爲O(n2),若採用鄰接表,則時間複雜度爲O(n+e)。
生成樹:是將圖中所有頂點以最少的邊連通的子圖。
最小生成樹:是權值和最小的生成樹就是最小生成樹。
最短路徑可以使用迪傑斯特拉(Dijkstra)算法。

AOV網是一個有向無環圖。即不應該帶有迴路,若不存在迴路,則所有活動可排列成一個線性序列,使得每個活動的所有前驅活動都排在該活動的前面,我們把此序列叫做拓撲序列(Topological order),由AOV網構造拓撲序列的過程叫做拓撲排序(Topological sort)。AOV網的拓撲序列不是唯一的,滿足上述定義的任一線性序列都稱作它的拓撲序列。

檢測有向環的一種是對AOV網絡構造它的拓撲有序列。即將各個頂點(代表各個活動)排成一個線性有序序列,使得AOV網絡中所有應存在的前驅和後繼關係都能滿足。另一種是深度優先搜索(沒有出現祖先的迴路)。

拓撲排序方法:
<1>從有向圖中選取一個沒有前驅的頂點,並輸出之;
<2>從有向圖中刪去此頂點以及所有以它爲尾的弧;
<3>重複上述兩步,直至圖空,或者圖不空但找不到無前驅的頂點爲止。
                                                                
                                                     

無向完全圖:
任意一個具有n個結點的無向簡單圖,其邊數小於等於n*(n-1)/2;我們把邊數恰好等於n*(n-1)/2的n個結點的無向圖稱爲完全圖。

有向完全圖:
在一個n個結點的有向圖中,最大邊數爲n*(n-1)。

強連通圖:

有向圖強連通分量的Tarjan算法 [有向圖強連通分量]。

在有向圖G中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通(strongly connected)。如果有向圖G的每兩個頂點都強連通,稱G是一個強連通圖。非強連通圖有向圖的極大強連通子圖,稱爲強連通分量(strongly connected components)。

直接根據定義,用雙向遍歷取交集的方法求強連通分量,時間複雜度爲O(N^2+M)。更好的方法是Kosaraju算法或Tarjan算法,兩者的時間複雜度都是O(N+M)。本文介紹的是Tarjan算法。 [Tarjan算法]

Tarjan算法是基於對圖深度優先搜索的算法,每個強連通分量爲搜索樹中的一棵子樹。搜索時,把當前搜索樹中未處理的節點加入一個堆棧,回溯時可以判斷棧頂到棧中的節點是否爲一個強連通分量。

發佈了24 篇原創文章 · 獲贊 8 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章