12. 圖--圖的遍歷

圖的遍歷

深度優先搜索

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)

連通圖概念

  • 連通:如果從VW 存在一條(無向)路徑,則稱VW 是連通的
  • 路徑:VW 的路徑是一系列頂點{V,V1,V2,...,Vn,W} 的集合,其中任一對相鄰的頂點間都有圖中的邊。如果VW 之間所有的頂點都不同,則稱簡單路徑
  • 路徑的長度:路徑中的邊數(如果帶權,則是所有邊的權重和)
  • 迴路:起點等於終點的路徑
  • 連通圖:圖中任意兩頂點均連通
  • 連通分量:無向圖的極大連通子圖
    • 極大頂點數:再加1個頂點就不連通了
    • 極大邊數:包含子圖中所有頂點相連的所有邊
  • 強連通:有向圖中頂點VW 之間存在雙向路徑,則稱VW 是強連通的
  • 強連通圖:有向圖中任意兩頂點均強連通
  • 強連通分量:有向圖的極大強連通子圖

處理圖不連通的遍歷

之前進行DFS和BFS遍歷,只是把V 所在的連通分量遍歷了一遍。如果需要遍歷到所有頂點,則需要重複調用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);
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章