4.2 - Graph Traversal

拜訪Graph中的每個頂點一次:

  1. Depth First Search

  2. Breadth First Search

DFS (Undirected Graph)

void DFS(int graph[NUM_NODES][NUM_NODES], int *visit, int start){
    //adjacency matrix(Graph以相鄰矩陣表示)
    printf("%d ", start);
    visit[start] = 1;
    for (int i = 0; i<NUM_NODES; i++){
        if (graph[start][i] == 1 && visit[i] == 0) //未曾拜訪過且是相鄰頂點
            DFS(graph, visit, i);
    }
}

DFS: 0→1→3→7→4→5→2→6

並非唯一,除非規定頂點編號小的優先。

BFS (Undirected Graph)

BFS: 0→1→2→3→4→5→6→7

BFS (Undirected Graph)(Algo)

可求頂點到各點的最短路徑長

DFS (Directed Graph)(Algo)

DFS: 0→1→2→3→4→5

  • Tree edge: 當v為white時,<u, v>為Tree edge

  • Back edge: 當v為gray時(v是u的祖先),<u, v>為Back edge

  • Forward edge: 當v為black時(v是u的後代),<u, v>可能為Forward edge

    u的discover time必須小於v的discover time才成立

  • Cross edge: 其餘的邊

應用

Is the undirected graph connected?

  1. DFS/BFS

  2. 檢查visit[]是否皆為True

    1. 是: connected

    2. 否: unconnected

Is there cycles in the graph?

判斷是否有back edge存在,有back edge則必有cycles。

Last updated