Duy Duy ệ ệ t theo chi t theo chi ề ề u sâu u sâu Thuật toán: - Chọn 1 đỉnh làm điểm bắt đầu - Bắt đầu duyệt từ đầu cho đến tận cùng của nhánh - Sau đó sẽ quay lại đoạn đường đã duyệt, và duyệt tiếp những đỉnh kề chưa được duyệt - Quá trình sẽ kết thúc khi quay lại đỉnh bắt đầu và tất cả các đỉnh đã được duyệt. - Trong quá trình duyệt, nếu 1 đỉnh sẽ rẽ qua nhiều hơn 1 đỉnh, thì ta chọn đỉnh có số hoặc chữ cái nhỏ hơn Duy Duy ệ ệ t theo chi t theo chi ề ề u sâu u sâu Bài tập: Duyệt đồ thị sau, bắt đầu từ đỉnh 2 Duy Duy ệ ệ t theo chi t theo chi ề ề u sâu u sâu Giải thuật: Sử dụng đệ qui void DFS (bool mark[][max], int trace[], int nodes, int u) { for (int v=0;v<nodes;v++) { if ((mark1[u][v] ==true) && (trace[v] ==0) { trace[v]=u; DFS(mark,trace,nodes,v); } } } Duy Duy ệ ệ t theo chi t theo chi ề ề u sâu u sâu Nhận xét: - Duyệt theo chiều sau của độ thì biểu diễn bằng danh sách kề có độ phức tạp O(n+m) // n- Số đỉnh, m- Số cạnh - Duyệt theo chiều sâu của đồ thị biểu diễn bằng ma trận kề có độ phức tạp O(n 2 ) - Duyệt theo chiều sâu thì đỉnh duyệt càng sớm thì càng kết thúc muộn. - Dùng một ngăn xếp lưu trữ các đỉnh đang duyệt để cải tiến thuật toán Duy Duy ệ ệ t theo chi t theo chi ề ề u r u r ộ ộ ng ng Duyệt theo chiều rộng: Duyệt có tính chất “lan rộng” . Xét 1 đỉnh bắt đầu, và duyệt tất cả các đỉnh kề với nó Ví dụ: A B D H C E G F 1 2 4 6 5 8 7 3 Th ứ t ự duy ệ t: A, B, C, D, E, H, F, G Duy Duy ệ ệ t theo chi t theo chi ề ề u r u r ộ ộ ng ng Thuật toán: - Chọn 1 đỉnh trong đồ thị để bắt đầu - Từ đỉnh đầu tiên, đi hết tất cả các đỉnh liên thông với nó - Tiếp tục xét với đỉnh thứ 2… - Quá trình kết thúc khi duyệt xong tất cả các đỉnh Duy Duy ệ ệ t theo chi t theo chi ề ề u r u r ộ ộ ng ng Bài tập: Duyệt đồ thị sau đây theo chiều rộng bắt đầu từ đỉnh 4 Duy Duy ệ ệ t theo chi t theo chi ề ề u r u r ộ ộ ng ng Giải thuật: void BFS (queue Q, int trace[], bool mark[][max], int start, int nodes) { int u; Q.push(start); trace[start]=-1; do{ u=Q.front(); Q.pop(); for ( int v=0;v<nodes;v++) { if ((mark[u][v]==true) && trace[v]=0; { Q.push(v); trace[v]=u; } } }while (!Q.empty()); } Duy Duy ệ ệ t theo chi t theo chi ề ề u r u r ộ ộ ng ng Nhận xét: - Duyệt theo chiều sâu và duyệt theo chiều rộng chỉ khác nha ở chỗ giải thuật DFS sử dụng Stack, và giải thuật BFS sử dụng Queue. Do đó độ phức tạp của DFS và BFS là như nhau - Duyệt theo chiều rộng thì đỉnh được xét càng sớm thì sẽ sớm duyệt xong CÂY BAO TR CÂY BAO TR Ù Ù M T M T Ố Ố I THI I THI Ể Ể U U Minimum spanning tree Minimum spanning tree . trace[v]=u; DFS(mark,trace,nodes,v); } } } Duy Duy ệ ệ t theo chi t theo chi ề ề u sâu u sâu Nhận xét: - Duyệt theo chiều sau của độ thì biểu diễn bằng danh sách kề có độ phức tạp O(n+m) // n- Số đỉnh, m- Số cạnh - Duyệt theo chiều sâu của. chữ cái nhỏ hơn Duy Duy ệ ệ t theo chi t theo chi ề ề u sâu u sâu Bài tập: Duyệt đồ thị sau, bắt đầu từ đỉnh 2 Duy Duy ệ ệ t theo chi t theo chi ề ề u sâu u sâu Giải thuật: Sử dụng đệ qui void. Q.push(v); trace[v]=u; } } }while (!Q.empty()); } Duy Duy ệ ệ t theo chi t theo chi ề ề u r u r ộ ộ ng ng Nhận xét: - Duyệt theo chiều sâu và duyệt theo chiều rộng chỉ khác nha ở chỗ giải thuật DFS sử dụng