Thuật toán tìm kiếm theo chiều rộng (Breadth First Search)

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 87 - 90)

LI R RL IR

6.3.2.Thuật toán tìm kiếm theo chiều rộng (Breadth First Search)

6. 2.3 Danh sách kề

6.3.2.Thuật toán tìm kiếm theo chiều rộng (Breadth First Search)

Để ý rằng, với thuật toán tìm kiếm theo chiều sâu, đỉnh thăm càng muộn sẽ trở thành đỉnh sớm đƣợc duyệt xong. Đó là kết quả tất yếu vì các đỉnh thăm đƣợc nạp vào stack trong thủ tục đệ qui. Khác với thuật toán tìm kiếm theo chiều sâu, thuật toán tìm kiếm theo chiều rộng thay thế việc sử dụng stack bằng hàng đợi queue. Trong thủ tục này, đỉnh đƣợc nạp vào hàng đợi đầu tiên là v, các đỉnh kề với v ( v1, v2, . . ., vk) đƣợc nạp vào queue kế tiếp. Quá trình đƣợc thực tƣơng tự với các đỉnh trong hàng đợi. Thuật toán dừng khi ta đã duyệt hết các đỉnh kề với đỉnh trong hàng đợi. Chúng ta có thể mô tả thuật toán bằng thủ tục BFS.

chuaxet- mảng kiểm tra các đỉnh đã xét hay chƣa;

queue – hàng đợi lƣu trữ các đỉnh sẽ đƣợc duyệt của đồ thị; procedure BFS(u);

begin

queue := ;

u <= queue; (*nạp u vào hàng đợi*) chuaxet[u] := false;

while (queue  ) do begin

queue<=p; (* lấy p ra từ stack*) Thăm_Đỉnh(p);

for v  ke(p) do

if (chuaxet[v] ) then begin

v<= queue; (*nạp v vào hàng đợi*) chuaxet[v] := false;

end; end;

end;

Thủ tục BFS sẽ thăm tất cả các đỉnh dùng thành phần liên thông với u. Để thăm tất cả các đỉnh của đồ thị, chúng ta chỉ cần thực hiện gọi tới thủ tục BFS().

begin for u V to n do chuaxet[u] := TRUE; for uV do if (chuaxet[u] then BFS(n); end;

Văn bản chƣơng trình cài đặt theo BFS đƣợ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 #dine FALSE 0

/* Breadth First Search */

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

fp=fopen("BFS.IN", "r"); if(fp==NULL){

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]); } } for(i=1; i<=*n;i++) chuaxet[i]=0; *solt=0; }

void BFS(int A[][MAX], int n, int i, int *solt, int chuaxet[], int QUEUE[MAX]){ int u, dauQ, cuoiQ, j;

dauQ=1; cuoiQ=1;QUEUE[cuoiQ]=i;chuaxet[i]=*solt; while(dauQ<=cuoiQ){

u=QUEUE[dauQ];printf("%3d",u);dauQ=dauQ+1; for(j=1; j<=n;j++){

if(A[u][j]==1 && chuaxet[j]==0){ cuoiQ=cuoiQ+1; QUEUE[cuoiQ]=j; chuaxet[j]=*solt; } } } } void main(void){

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

printf("\n\n"); for(i=1; i<=n; i++)

if(chuaxet[i]==0){ solt=solt+1;

BFS(A, n, i, &solt, chuaxet, QUEUE); }

getch(); } (adsbygoogle = window.adsbygoogle || []).push({});

Ví dụ. áp dụng thuật toán tìm kiếm theo chiều rộng với đồ thị trong hình 6.12: Bƣớc 1. Queue = ; Bƣớc 2.- Queue = 1; - Queue = 1, 2, 3, 11; - Queue = 1, 2, 3, 11, 6, 4; - Queue = 1, 2, 3, 11, 4, 6,12, 13; - Queue = 1, 2, 3, 11, 4, 6, 12, 13, 7, 8; - Queue = 1, 2, 3, 11, 4, 6, 12, 13, 7, 8, 9; - Queue = 1, 2, 3, 11, 4, 6, 12, 13, 7, 8, 9, 10; - Queue = 1, 2, 3, 11, 4, 6, 12, 13, 7, 8, 9, 10, 5;

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 87 - 90)