深度優先搜索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有路徑相通的頂點都被訪問過爲止。
<1>從有向圖中選取一個沒有前驅的頂點,並輸出之;
有向圖強連通分量的Tarjan算法 [有向圖強連通分量]。
在有向圖G中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通(strongly connected)。如果有向圖G的每兩個頂點都強連通,稱G是一個強連通圖。非強連通圖有向圖的極大強連通子圖,稱爲強連通分量(strongly connected components)。
直接根據定義,用雙向遍歷取交集的方法求強連通分量,時間複雜度爲O(N^2+M)。更好的方法是Kosaraju算法或Tarjan算法,兩者的時間複雜度都是O(N+M)。本文介紹的是Tarjan算法。 [Tarjan算法]
Tarjan算法是基於對圖深度優先搜索的算法,每個強連通分量爲搜索樹中的一棵子樹。搜索時,把當前搜索樹中未處理的節點加入一個堆棧,回溯時可以判斷棧頂到棧中的節點是否爲一個強連通分量。