圖的遍歷
深度優先搜索
Depth First Search,DFS
僞代碼
void DFS(Vertex V) {
visited[V] = true;
for (V 的每個鄰接點 W) {
if (!visited[W])
DFS(W);
}
}
若有N個頂點、E條邊,時間複雜度是
- 用鄰接表存儲圖,爲
O(N+E) - 用鄰接矩陣存儲圖,爲
O(N2)
廣度優先搜索
Breadth First Search, BFS
僞代碼
void BFS(Vertex V) {
visited[V] = true;
Enqueue(V, Q);
while (!IsEmpty(Q)) {
V = Dequeue(Q);
for (V 的每個鄰接點 W) {
if (!visited[W])
visited[W] = true;
Enqueue(W, Q);
}
}
}
}
若有N個頂點、E條邊,時間複雜度是
- 用鄰接表存儲圖,爲
O(N+E) - 用鄰接矩陣存儲圖,爲
O(N2)
連通圖概念
- 連通:如果從
V 到W 存在一條(無向)路徑,則稱V 和W 是連通的 - 路徑:
V 到W 的路徑是一系列頂點{V,V1,V2,...,Vn,W} 的集合,其中任一對相鄰的頂點間都有圖中的邊。如果V 到W 之間所有的頂點都不同,則稱簡單路徑 - 路徑的長度:路徑中的邊數(如果帶權,則是所有邊的權重和)
- 迴路:起點等於終點的路徑
- 連通圖:圖中任意兩頂點均連通
- 連通分量:無向圖的極大連通子圖
- 極大頂點數:再加1個頂點就不連通了
- 極大邊數:包含子圖中所有頂點相連的所有邊
- 強連通:有向圖中頂點
V 和W 之間存在雙向路徑,則稱V 和W 是強連通的 - 強連通圖:有向圖中任意兩頂點均強連通
- 強連通分量:有向圖的極大強連通子圖
處理圖不連通的遍歷
之前進行DFS和BFS遍歷,只是把
DFS
void ListComponents(Graph G) {
for (each V is G) {
if (!visited[V]) {
DFS(V);
}
}
}
BFS
void ListComponents(Graph G) {
for (each V is G) {
if (!visited[V]) {
BFS(V);
}
}
}