---
# System prepended metadata

title: Graph Traversal - DFS
tags: [DS, ch6, Adjacency Lists, DFS, GRAPH]

---

# Graph Traversal - DFS
###### tags: `DS` `DFS` `GRAPH` `ch6` `Adjacency Lists`



|                           | DFS    | BFS    |
| ------------------------- | ------ | ------ |
| 輔助的DS                  | Stack  | Queue |
| 相鄰串列(Adjacency Lists) | O(n+e) | O(n+e) |
| 相鄰矩陣(Adjacency Matrix)| O(n**2) | O(n**2) |

## DS版本 (皆對無向圖) (採用Adjacenty Lists)
```javascript=
DFS(Vertex V of Graph G){
    //Assume have a global array visited[1..n] of boolean
    //n = num of v
    visited[v] = True; // becuz vertex already visited.
    foreach(vertex w adjacency to v do){
        if(visited[w] == false) DFS(w);
    }
}
```
**Note:** DFS order並不唯一，故通常會設定值小者優先，如此會唯一。

## Algo版本 (對有向圖) (採用Adjacenty Lists)
Note: the **u.d** and **u.f** in DFS-visit is... 
1. u.d == the **discovered** time of u.
2. u.f == the **finished** time of u.
3. u.color == White (haven't been vistied)
4. u.color == Gray (already visit but the adjacency vertex of u didn't finish yet)
5. u.color == Black (finished visit)

keyPoint!
1. every vertex **before visit is white!**
2. every vertex **before visit is NULL!**
3. every vertex **should be checked whether color is white before visit**, if true then visit!
```javascript=
DFS(Graph G){ // initialize the graph
    foreach(vertex u belongs to G.V do){
        u.color = white;
        u.pi = NULL;
    }
    time = 0;
    foreach(vertex u belongs to G.V do){
        if(u.color == white) DFS-visit(G, u);
    }
}

DFS-visit(G, u){
    time += 1;
    u.d = time;
    u.color = Gray;
    foreach(v belongs to G.Adj[u]){
        if(v.color == white){
            v.pi = u;
            DFS-visit(G, v);
        }        
    }
    time += 1;
    u.color = Black;
    u.f = time;
}
```
## DFS有向圖, 邊的種類有分四種(詳記顏色意義)
1. Tree Edge:
    DFS經過的edge, (u,v) -> v is White.
2. Back Edge:
    回到祖先的edge, (u,v) -> v is Gray.
3. Forward Edge:
    指向後代的edge, (u,v) -> v is Black.
4. Cross Edge:
    跨越不同子樹的edge
    判斷:(u,v) is Black,可能為Forward or Cross edge 須根據以下情況判斷...
    ```
    if(u.d < v.d) then (u,v) is Forward.
    else Cross edge.
    ```





