4.2 - Graph Traversal
拜訪Graph中的每個頂點一次:
Depth First Search
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?
DFS/BFS
檢查
visit[]是否皆為True是: connected
否: unconnected
Is there cycles in the graph?
判斷是否有back edge存在,有back edge則必有cycles。
Last updated