Tải bản đầy đủ (.pdf) (22 trang)

BFS Duyệt đồ thị theo chiều rộng

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (204.82 KB, 22 trang )

Duyệt đồ thị theo chiều rộng - Breadth-First
Search (BFS)
Thuật toán sử dụng một cấu trúc dữ liệu hàng đợi để lưu
trữ thông tin trung gian thu được trong quá trình tìm kiếm:

1. Chèn đỉnh gốc vào hàng đợi
2. Lấy ra đỉnh đầu tiên trong hàng đợi và quan sát nó.
Nếu đỉnh này đã duyệt, không làm gì cả, quay lại bước 2.
Nếu đỉnh này chưa duyệt thì chèn tất cả các đỉnh chưa
duyệt kề với nó vào hàng đợi.
3.Hàng đợi là rỗng thì dừng.
4. Nếu hàng đợi không rỗng thì quay về bước 2.


Sử dụng mảng Đã duyệt, mảng Lưu vết và 1 Squeue
• DaDuyet[i] = 0 ----> đỉnh i chưa duyệt
• DaDuyet[i] = t ----> đỉnh i được duyệt theo thứ tự t
• LuuVet[i] = k ----> đỉnh i được đến từ đỉnh k
• Nếu i là đỉnh bắt đầu thì LuuVet[i] = 1
• Squeue: Lưu lại các đỉnh chuẩn bị xem xét

• Xem ví dụ minh họa ở các slide sau:


BFS

Đã duyệt

0 1 2 3 4 5 6 7 8 9 10 11 12
0 1 0 0 0 0 0 0 0 0 0 0 0


Lưu vết

- 1 -

Squeue

1

- - - - -

- - - - -

2

t=1
1

3

7

4

6

12
0

5


11

10

8
9


BFS

Đã duyệt

0 1 2 3 4 5 6 7 8 9 10 11 12
0 1 0 0 0 0 0 0 0 0 0 0 0

Lưu vết

- 1 - - - - - -

Squeue

1

- - - - -

2

pop() ---> 1
1


3

7

4

6

12
0

5

11

10

8
9


BFS

Đã duyệt

0 1 2 3 4 5 6 7 8 9 10 11 12
0 1 2 0 3 0 0 0 0 0 0 0 4

Lưu vết


- 1 1 - 1 - - -

Squeue

1 2 4 12

- - - - 1

Nếu DaDuyet[2] = 0
push(2)
DaDuyet[2] = t++, LuuVet[2]=1
Nếu DaDuyet[4] = 0
push(4)
DaDuyet[4] = t++, LuuVet[4]=1
Nếu DaDuyet[12] = 0
push(12)
DaDuyet[12] = t++, LuuVet[12]=1

2

1

3

7

4

6


12
0

5

11

10

8
9


BFS

Đã duyệt

0 1 2 3 4 5 6 7 8 9 10 11 12
0 1 2 0 3 0 0 0 0 0 0 0 4

Lưu vết

- 1 1 - 1 - - -

Squeue

1 2 4 12

- - - - 1


2

pop() ---> 2
1

3

7

4

6

12
0

5

11

10

8
9


BFS

Đã duyệt


0 1 2 3 4 5 6 7 8 9 10 11 12
0 1 2 0 3 0 0 0 0 0 0 0 4

Lưu vết

- 1 1 - 1 - - -

Squeue

1 2 4 12

Nếu DaDuyet[1] = 1 = 0
Không làm gì cả
Nếu DaDuyet[4] = 3 = 0
Không làm gì cả

- - - - 1

2

1

3

7

4

6


12
0

5

11

10

8
9


BFS

Đã duyệt

0 1 2 3 4 5 6 7 8 9 10 11 12
0 1 2 0 3 0 0 0 0 0 0 0 4

Lưu vết

- 1 1 - 1 - - -

Squeue

1 2 4 12

- - - - 1


2

pop() ---> 4
1

3

7

4

6

12
0

5

11

10

8
9


BFS

Đã duyệt


0 1 2 3 4 5 6 7 8 9 10 11 12
0 1 2 0 3 0 5 6 0 0 0 0 4

Lưu vết

- 1 1 - 1 - 4 4 - - - - 1

Squeue

1 2 4 12 6 7

Nếu DaDuyet[6] = 0
push(6)
DaDuyet[6] = t++, LuuVet[6]=4
Nếu DaDuyet[7] = 0
push(7)
DaDuyet[7] = t++, LuuVet[6]=4

2

1

3

7

4

6


12
0

5

11

10

8
9


BFS

Đã duyệt

0 1 2 3 4 5 6 7 8 9 10 11 12
0 1 2 0 3 0 5 6 0 0 0 0 4

Lưu vết

- 1 1 - 1 - 4 4 - - - - 1

Squeue

1 2 4 12 6 7
2

pop() ---> 12

1

3

7

4

6

12
0

5

11

10

8
9


BFS

Đã duyệt

0 1 2 3 4 5 6 7 8 9 10 11 12
7 1 2 0 3 0 5 6 0 0 0 8 4


Lưu vết

12 1 1 - 1 - 4 4 - - - 12 1

Squeue

1 2 4 12 6 7 0 11

Nếu DaDuyet[0] = 0
push(0)
DaDuyet[0] = t++, LuuVet[0]=12
Nếu DaDuyet[11] = 0
push(11)
DaDuyet[11] = t++, LuuVet[11]=12

2

1

3

7

4

6

12
0


5

11

10

8
9


BFS

Đã duyệt

0 1 2 3 4 5 6 7 8 9 10 11 12
7 1 2 0 3 0 5 6 0 0 0 8 4

Lưu vết

12 1 1 - 1 - 4 4 - - - 12 1

Squeue

1 2 4 12 6 7 0 11
2

pop() ---> 6
1

3


7

4

6

12
0

5

11

10

8
9


BFS

Đã duyệt

0 1 2 3 4 5 6 7 8 9 10 11 12
7 1 2 0 3 9 5 6 0 0 10 8 4

Lưu vết

12 1 1 - 1 6 4 4 - - 6 12 1


Squeue

1 2 4 12 6 7 0 11 5 10

Nếu DaDuyet[5] = 0
push(5)
DaDuyet[5] = t++, LuuVet[5]=6
Nếu DaDuyet[10] = 0
push(10)
DaDuyet[10] = t++, LuuVet[10]=6

2

1

3

7

4

6

12
0

5

11


10

8
9


BFS

Đã duyệt

0 1 2 3 4 5 6 7 8 9 10 11 12
7 1 2 0 3 9 5 6 0 0 10 8 4

Lưu vết

12 1 1 - 1 6 4 4 - - 6 12 1

Squeue

1 2 4 12 6 7 0 11 5 10
2

pop() ---> 7
1

3

7


4

6

12
0

5

11

10

8
9


BFS

Đã duyệt

0 1 2 3 4 5 6 7 8 9 10 11 12
7 1 2 11 3 9 5 6 0 0 10 8 4

Lưu vết

12 1 1 7 1 6 4 4 - - 6 12 1

Squeue


1 2 4 12 6 7 0 11 5 10 3
2

Nếu DaDuyet[3] = 0
push(3)
DaDuyet[3] = t++, LuuVet[3]=7
1

3

7

4

6

12
0

5

11

10

8
9


BFS


Đã duyệt

0 1 2 3 4 5 6 7 8 9 10 11 12
7 1 2 11 3 9 5 6 0 0 10 8 4

Lưu vết

12 1 1 7 1 6 4 4 - - 6 12 1

Squeue

1 2 4 12 6 7 0 11 5 10 3
2

pop() ---> 0
pop() ---> 11
1

3

7

4

6

12
0


5

11

10

8
9


BFS

Đã duyệt

0 1 2 3 4 5 6 7 8 9 10 11 12
7 1 2 11 3 9 5 6 0 0 10 8 4

Lưu vết

12 1 1 7 1 6 4 4 - - 6 12 1

Squeue

1 2 4 12 6 7 0 11 5 10 3
2

pop() ---> 5
1

3


7

4

6

12
0

5

11

10

8
9


BFS

Đã duyệt

0 1 2 3 4 5 6 7 8 9 10 11 12
7 1 2 11 3 9 5 6 12 13 10 8 4

Lưu vết

12 1 1 7 1 6 4 4 5 5 6 12 1


Squeue

1 2 4 12 6 7 0 11 5 10 3 8 9

Nếu DaDuyet[8] = 0
push(8)
DaDuyet[8] = t++, LuuVet[8]=5
Nếu DaDuyet[9] = 0
push(9)
DaDuyet[9] = t++, LuuVet[9]=5

2

1

3

7

4

6

12
0

5

11


10

8
9


BFS

Đã duyệt

0 1 2 3 4 5 6 7 8 9 10 11 12
7 1 2 11 3 9 5 6 12 13 10 8 4

Lưu vết

12 1 1 7 1 6 4 4 5 5 6 12 1

Squeue

1 2 4 12 6 7 0 11 5 10 3 8 9
2

pop() ---> 10
1

3

7


4

6

12
0

5

11

10

8
9


BFS

Đã duyệt

0 1 2 3 4 5 6 7 8 9 10 11 12
7 1 2 11 3 9 5 6 12 13 10 8 4

Lưu vết

12 1 1 7 1 6 4 4 5 5 6 12 1

Squeue


1 2 4 12 6 7 0 11 5 10 3 8 9
2

pop() ---> 3
1

3

7

4

6

12
0

5

11

10

8
9


BFS

Đã duyệt


0 1 2 3 4 5 6 7 8 9 10 11 12
7 1 2 11 3 9 5 6 12 13 10 8 4

Lưu vết

12 1 1 7 1 6 4 4 5 5 6 12 1

Squeue

1 2 4 12 6 7 0 11 5 10 3 8 9

pop() ---> 8
pop() ---> 9
Squeue rổng ---> Dừng

2

1

3

7

4

6

12
0


5

11

10

8
9


BFS

Đã duyệt

0 1 2 3 4 5 6 7 8 9 10 11 12
7 1 2 11 3 9 5 6 12 13 10 8 4

Lưu vết

12 1 1 7 1 6 4 4 5 5 6 12 1

Squeue

1 2 4 12 6 7 0 11 5 10 3 8 9

Thứ tự duyệt: dựa vào
mảng Đã duyệt ta có thứ
tự duyệt:
Đỉnh: 1, 2, 4, 12, 6, 7,0,

11, 5, 10, 3, 8, 9

2

1

3

7

4

6

12
0

5

11

10

8
9



×