Tìm kiếm theo chiều sâu trên đồ thị

Một phần của tài liệu Thuật toán và cấu trú dữ liệu (Trang 67 - 68)

Xuất phát từ đỉnh v của đồ thị, sau đó chọn đỉnh w là đỉnh tùy ý kề với v, và lặp lại quá trình tìm kiếm đối với đỉnh w. Ở bước tổng quát, giả sử ta đang xét đỉnh u, nếu

như trong số các đỉnh kề với u tìm được đỉnh nào chưa xét thì ta sẽ xét đỉnh này và bắt đầu từ nó ta lặp lại quá trình tìm kiếm.

Giải thuật này kiểm tra xem xuất phát tại một đỉnh bất kỳ trong đồ thị có tồn tại đường đi đến các đỉnh khác không? Nếu có, thì tất cả các đỉnh này sẽ được thăm, ngược lại nếu đỉnh nào không được thăm thì không tồn tại đường đi đến đỉnh đó.

 Giải thuật tìm kiếm theo chiều sâu

procedure DFS(v)

/* Đồ thị vô hướng G=(V,E) có n đỉnh và mảng VlSlTED(n) được khởi tạo bằng 0, giải thuật này thăm tất cả các đỉnh xuất phát từ đỉnh v, với G và VISITED là biến toàn cục*/

VISITED (v)  1

for each đỉnh w kề với v do

if VISlTED(w) = 0 then call DFS(w)

end end DFS

procedure COMP(G,n)

/*G là đồ thị có n đỉnh, VISITED là biến mảng địa phương.*/

for i  1 to n do

VISITED(i)  0 /*Khởi tạo tất cả các đỉnh chưa được thăm*/

end

for i 1 to n do

if VISITED(i) = 0 then [call DFS(i);

Xuất các đỉnh mới thăm cùng với các cạnh liên quan với chúng]

end end COMP

 Cài đặt giải thuật tìm kiếm theo chiều sâu bằng ngôn ngữ C/C++

void DFS(int v) { VISITED[v] = 1; Tro *w=Dinh[v]; while(w) { if(VISITED[w->nd]==0)DFS(w->nd); w = w->link; } }

void Tham(int n) {

for(int i=1;i<=n; i++) VISITED[i]=0; }

void COMP(int n) {

for(int i=1;i<=n; i++)

if(VISITED[i] == 0)

{

DFS(i);

for(int j=1;j<=n;j++) if(!VISITED[j])

cout<<"\nKhong co duong di tu dinh "<<i<<" den "<<j; Tham(n);

} }

Một phần của tài liệu Thuật toán và cấu trú dữ liệu (Trang 67 - 68)