Thuật toán tìm kiếm theo chiều sâu

Một phần của tài liệu Bài giảng Các kĩ thuật lập trình: Phần 2 (Trang 85 - 87)

LI R RL IR

6.3.1.Thuật toán tìm kiếm theo chiều sâu

6. 2.3 Danh sách kề

6.3.1.Thuật toán tìm kiếm theo chiều sâu

Rất nhiều thuật toán trên đồ thị đƣợc xây dựng trên việc duyệt tất cả các đỉnh của đồ thị sao cho mỗi đỉnh đƣợc viếng thăm đúng một lần. Những thuật toán nhƣ vậy đƣợc gọi là thuật toán tìm kiếm trên đồ thị. Chúng ta cũng sẽ làm quen với hai thuật toán tìm kiếm cơ bản, đó là duyệt theo chiều sâu (Depth First Search) và duyệt theo chiều rộng (Breath First Search).

Tƣ tƣởng cơ bản của thuật toán tìm kiếm theo chiều sâu là bắt đầu tại một đỉnh v0 nào

đó, chọn một đỉnh u bất kỳ kề với v0 và lấy nó làm đỉnh duyệt tiếp theo. Cách duyệt tiếp

theo đƣợc thực hiện tƣơng tự nhƣ đối với đỉnh v0.

Để kiểm tra việc duyệt mỗi đỉnh đúng một lần, chúng ta sử dụng một mảng gồm n phần tử (tƣơng ứng với n đỉnh), nếu đỉnh thứ i đã đƣợc duyệt, phần tử tƣơng ứng trong mảng có giá trị FALSE. Ngƣợc lại, nếu đỉnh chƣa đƣợc duyệt, phần tử tƣơng ứng trong mảng có giá trị TRUE. Thuật toán tìm kiếm theo chiều sâu bắt đầu từ đỉnh v nào đó sẽ duyệt tất cả các đỉnh liên thông với v. Thuật toán có thể đƣợc mô tả bằng thủ tục đệ qui DFS () trong đó: chuaxet - là mảng các giá trị logic đƣợc thiết lập giá trị TRUE

procedure DFS( v); begin

Thăm_Đỉnh(v); chuaxet[v] := FALSE; for u ke(v) to n do

if (chuaxet[u] ) then

DFS(A, n, v, chuaxet); end;

Thủ tục DFS() sẽ thăm tất cả các đỉnh cùng thành phần liên thông với v mỗi đỉnh đúng một lần. Để đảm bảo duyệt tất cả các đỉnh của đồ thị (có thể có nhiều thành phần liên thông), chúng ta chỉ cần thực hiện :

begin for i:=1 to n do chuaxet[i] := TRUE; for i:=1 to n do if (chuaxet[i] ) then DFS(A, n, i, chuaxet); end;

Chú ý: Thuật toán tìm kiếm theo chiều sâu dễ dàng áp dụng cho đồ thị có hƣớng. Đối với đồ thị có hƣớng, chúng ta chỉ cần thay các cạnh vô hƣớng bằng các cung của đồ thị có hƣớng.

Ví dụ 1. áp dụng thuật toán tìm kiếm theo chiều sâu với đồ thị trong hình sau:

2 6 8 7 1 4 5 3 10 11 9 12 13 Hình 6.12. Đồ thị vô hướng G Kết quả duyệt: 1, 2, 4 , 3, 6, 7, 8, 10, 5, 9, 13, 11, 12 Văn bản chƣơng trình đƣợc thể hiện nhƣ sau:

#include <stdio.h> #include <conio.h> #include <io.h> #include <stdlib.h> #include <dos.h> #define MAX 100 #define TRUE 1 #define FALSE 0 /* Depth First Search */

void Init(int A[][MAX], int *n){ FILE *fp; int i, j;

if(fp==NULL){

printf("\n Khong co file input"); delay(2000);return;

}

fscanf(fp,"%d", n);

printf("\n So dinh do thi:%d",*n); printf("\n Ma tran ke cua do thi:"); for(i=1; i<=*n;i++){ printf("\n"); for(j=1; j<=*n;j++){ fscanf(fp,"%d", &A[i][j]); printf("%3d", A[i][j]); } } }

void DFS(int A[][MAX], int n, int v, int chuaxet[]){ int u;

printf("%3d",v);chuaxet[v]=FALSE; for(u=1; u<=n; u++){

if(A[v][u]==1 && chuaxet[u]) DFS(A,n, u, chuaxet); }

}

void main(void){

int A[MAX][MAX], n, chuaxet[MAX]; Init(A, &n);

for(int i=1; i<=n; i++) chuaxet[i]=TRUE; printf("\n\n"); for(i=1; i<=n;i++) if(chuaxet[i]) DFS( n); getch(); }

Một phần của tài liệu Bài giảng Các kĩ thuật lập trình: Phần 2 (Trang 85 - 87)