1. Trang chủ
  2. » Luận Văn - Báo Cáo

skkn cấp tỉnh ứng dụng thuật toán tìm kiếm theo chiều rộng bfs để giải quyết một số bài toán đồ thị trong tin học

23 6 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Ứng dụng thuật toán tìm kiếm theo chiều rộng (BFS) để giải quyết một số bài toán đồ thị trong tin học
Tác giả Nguyễn Thị Hằng
Trường học Trường THPT Chu Văn An
Chuyên ngành Tin học
Thể loại Sáng kiến kinh nghiệm
Năm xuất bản 2024
Thành phố Thanh Hoá
Định dạng
Số trang 23
Dung lượng 555,5 KB

Nội dung

SỞ GIÁO DỤC VÀ ĐÀO TẠO THANH HOÁ TRƯỜNG THPT CHU VĂN AN SÁNG KIẾN KINH NGHIỆM ỨNG DỤNG THUẬT TOÁN TÌM KIẾM THEO CHIỀU RỘNG BFS ĐỂ GIẢI QUYẾT MỘT SỐ BÀI TOÁN ĐỒ THỊ TRONG TIN HỌC Người t

Trang 1

SỞ GIÁO DỤC VÀ ĐÀO TẠO THANH HOÁ

TRƯỜNG THPT CHU VĂN AN

SÁNG KIẾN KINH NGHIỆM

ỨNG DỤNG THUẬT TOÁN TÌM KIẾM THEO CHIỀU RỘNG (BFS) ĐỂ GIẢI QUYẾT MỘT SỐ

BÀI TOÁN ĐỒ THỊ TRONG TIN HỌC

Người thực hiện: Nguyễn Thị Hằng Chức vụ: Giáo viên

SKKN thuộc lĩnh vực (môn): Tin học

THANH HOÁ NĂM 2024

Trang 2

MỤC LỤC

Trang

I Phần mở đầu 1

1.1 Lý do chọn đề tài 1

1.2 Mục đích nghiên cứu 1

1.3 Đối tượng nghiên cứu 2

1.4 Phương pháp nghiên cứu 2

1.5 Những điểm mới trong kết quả nghiên cứu 2

II Phần nội dung 3

2.1 Cơ sở lý luận của sáng kiến kinh nghiệm 3

2.1.1 Đồ thị và tầm quan trọng 3

2.1.2 Biểu diễn đồ thị 3

2.1.3 Tìm kiếm trên đồ thị và tìm thành phần liên thông trên đồ thị 5

2.2 Thực trạng của vấn đề 7

2.2.1 Thuận lợi 7

2.2.2 Khó khăn 7

2.3 BFS và bài tập ứng dụng 7

2.3.1 Thuật toán duyệt đồ thị ưu tiên chiều rộng 7

2.3.2 Ứng dụng BFS để xác định thành phần liên thông 10

2.3.3 Thuật toán loang (Flood Fill) 11

2.3.4 Ứng dụng BFS để tìm đường đi ngắn nhất trong đồ thị không trọng số 14

2.3.5 Ứng dụng BFS để tìm chu trình ngắn nhất trong đồ thị có hướng không trọng số 18

III Kết quả và kiến nghị đề xuất 19

3.1 Kết quả nghiên cứu 19

3.2 Kiến nghị, đề xuất 20

Tài liệu tham khảo

Trang 3

I Phần mở đầu

1.1 Lý do chọn đề tài

Là một giáo viên THPT, tôi nhận thấy rằng: Tin học hiện nay là một môn

học mà học sinh rất yêu thích, hăng say học tập Đặc biệt, rất nhiều em đam mêlập trình, xin tham gia học các lớp bồi dưỡng học sinh giỏi tin, tự học trên cácnhóm mạng, tự nghiên cứu các chuyên đề chuyên sâu về lập trình Có rất nhiềucác chuyên đề tin học rất hay, ứng dụng rất nhiều trong các bài toán và thực tế.Chuyên đề về đồ thị trong tin học cũng là một chuyên đề được giáo viên và họcsinh quan tâm

Chuyên đề đồ thị trong Tin học là một chuyên đề quan trọng đã được ứngdụng vào nhiều ngành khoa học, kỹ thuật khác nhau vì lý thuyết đồ thị làphương pháp khoa học có tính khái quát cao, có tính ổn định vững chắc để mãhóa các mối quan hệ của các đối tượng được nghiên cứu Khi giảng dạy chuyên

đề về đồ thị cho học sinh THPT thường gặp phải hai vấn đề chính đó là chưa có

hệ thống bài tập rõ ràng và chuyên đề về đồ thị tương đối mới, khó đối với đại

bộ phận giáo viên dạy Tin học trong tỉnh Thông thường các giáo viên chỉ giảithích lý thuyết và cung cấp một số ví dụ để học sinh có thể hiểu cơ bản Tuynhiên, điều này khiến cho học sinh gặp khó khăn trong việc nắm vững kiến thức

và áp dụng vào các bài tập thực tế

Bài tập Tin học liên quan tới đồ thị và giải thuật để giải các bài toán đồ thịtrong các đề thi học sinh giỏi cấp tỉnh thường đa dạng Để có tài liệu dạy độituyển, giáo viên thường phải dày công tìm tòi từ nhiều nguồn tư liệu, do đó mấtrất nhiều thời gian và công sức, tốn kém tiền bạc Chuyên đề về đồ thị tương đốikhó và việc tiếp cận các tài liệu, sách báo chuyên ngành cũng gặp hề đơn giản vìnguồn tài nguyên trên Internet là rời rạc, chưa có hệ thống Hai thuật toánthường được áp dụng trong các bài toán về đồ thị đó là: tìm kiếm theo chiềurộng (BFS) và tìm kiếm theo chiều sâu (DFS) Cả 2 thuật toán này đều rất hay,ứng dụng rất nhiều trong bài tập đồ thị, nhưng cũng là thuật toán khó đối với họcsinh ôn luyện học sinh giỏi và học sinh muốn tìm hiểu nâng cao về lập trình.Bản thân tôi cũng là một giáo viên nhiều năm được nhà trường giao nhiệm

vụ dạy đội tuyển tin học, cũng rất trăn trở khi giảng dạy chuyên đề đồ thị Từcác lí do trên và trong phạm vi nghiên cứu, tôi xin trình bày sáng kiến kinhnghiệm : “ỨNG DỤNG THUẬT TOÁN TÌM KIẾM THEO CHIỀU RỘNG(BFS) ĐỂ GIẢI QUYẾT MỘT SỐ BÀI TOÁN ĐỒ THỊ TRONG TIN HỌC”

Hy vọng đề tài trở thành một tài liệu quý cho học sinh yêu thích môn tin học vàcũng là tài liệu đáng tham khảo cho quý thầy cô trong quá trình tham gia bồidưỡng đội tuyển học sinh giỏi tỉnh để có thể góp phần đưa về cho đội tuyển củamình những thành tích cao nhất

1.2 Mục đích nghiên cứu

*Mục tiêu của đề tài: Chỉ ra hướng BFS trong lý thuyết đồ thị vào giảicác bài toán và tìm ra các biện pháp để giúp học sinh THPT hình thành và pháttriển năng lực vận dụng lý thuyết đồ thị vào giải bài tập lập trình

* Nhiệm vụ của đề tài:

- Tìm hiểu những nội dung cơ bản của lý thuyết đồ thị

- Chỉ ra hệ thống bài tập có thể vận dụng lý thuyết đồ thị để giải

Trang 4

- Chỉ ra được những dấu hiệu cụ thể để nhận dạng “Bài toán” có thể khaithác lý thuyết đồ thị trong quá trình giải bài toán.

- Chỉ ra các phương án vận dụng lý thuyết đồ thị vào giải toán

1.3 Đối tượng nghiên cứu

Tôi được phân công bồi dưỡng học sinh giỏi môn tin học của nhà trườngnên đối tượng nghiên cứu của tôi là học sinh các lớp chọn của khối, học sinhđược chọn vào đội tuyển tin học, học sinh có niềm đam mê tin học Chủ đề về

đồ thị cũng luôn là chủ đề mà các em yêu thích và quan tâm

1.4 Phương pháp nghiên cứu

a Nghiên cứu lý luận.

- Nghiên cứu các văn bản, tài liệu chỉ đạo của Bộ GD & ĐT liên quanđến đổi mới phương pháp dạy học

- SGK, phân phối chương trình, sách giáo viên, chuẩn của bộ môn Tin ởtrung học phổ thông, sách nâng cao, sách chuyên đề

- Các tài liệu về lý thuyết đồ thị và những ứng dụng của nó trong thựctiễn cuộc sống và trong dạy học

- Các công trình nghiên cứu các vấn đề liên quan trực tiếp đến phươngpháp đồ thị

- Tiến hành thực nghiệm và đánh giá kết quả thực nghiệm

1.5 Những điểm mới trong kết quả nghiên cứu

Đề tài hệ thống kiến thức thông qua việc phân loại các dạng bài tập đồ thị

sử dụng thuật toán BFS Do đó, BFS và các bài toán ứng dụng được xây dựng làrất logic, đa dạng, phong phú, thể hiện kiến thức bao chùm từ cơ bản đến phứctạp, từ dễ đến khó, phù hợp với trình độ nhận thức của học sinh, có thể dành chonhiều đối tượng học sinh dự thi học sinh giỏi THPT

Đối với học sinh lần đầu tiên tiếp cận với lý thuyết đồ thị sẽ không tránhkhỏi những ngỡ ngàng, lạ lẫm, có phần trừu tượng khó hiểu Để giúp đỡ giảiquyết vấn đề đó, trong chuyên đề này tác giả trình bày về phương pháp duyệttheo chiều rộng (BFS) trên đồ thị và các ứng dụng Phần lý thuyết về cơ bản đãrất rõ ràng trong cuốn Tài liệu giáo khoa chuyên Tin, tác giả trình bày lại theohướng tiếp cận khác nhằm mục đính giúp cho giáo viên và học sinh có thể dễdàng nghiên cứu hơn Tác giả trình bày về những ứng dụng cơ bản của BFS vàcác bài tập cho học sinh luyện tập, các bài tập được sắp xếp theo từng chủ đề,mỗi bài có hướng dẫn sơ lược, đưa ra thuật toán, và code bằng ngôn ngữ C++cho từng bài Hệ thống bài tập lựa chọn đưa vào trong nội dung nghiên cứu nàyđược sưu tầm chủ yếu nguồn trên SPOJ và VNOI, Code mẫu một phần là củachính tác giả, một phần được tham khảo trên Internet Nội dung chủ yếu của đềtài nghiên cứu nhằm mục đích ôn luyện cho học sinh giỏi tỉnh môn tin chủ đề về

đồ thị

Trang 5

II Phần nội dung

2.1 Cơ sở lý luận của sáng kiến kinh nghiệm

2.1.1 Đồ thị và tầm quan trọng

Lý thuyết đồ thị là một lĩnh vực nghiên cứu đã có từ lâu và có nhiều ứngdụng hiện đại Các bài toán đặt ra nếu được đưa về lý thuyết đồ thị để giải sẽtiết kiệm được rất nhiều thời gian, ý tưởng thuật toán sẽ rõ ràng, chương trìnhngắn gọn và dễ hiểu Nếu hiểu và biết vận dụng tốt lý thuyết đồ thị sẽ giúpchúng ta giải quyết được rất nhiều bài toán đặt ra trong thực tế Khoa học và

kỹ thuật phát triển làm xuất hiện hàng loạt bài toán trong thực tiễn được quy

về mô hình đồ thị

a Định nghĩa đồ thị: Cho tập hợp X khác rỗng, E là tập hợp các cặp

phần tử của X được sắp xếp thứ tự hoặc không sắp thứ tự Cặp (X, E) được gọi

là một đồ thị Kí hiệu đồ thị là G = (X, E) hoặc kí hiệu tắt là G.

b Một số khái nhiệm.

- Các phần tử thuộc tập X gọi là đỉnh của đồ thị G

- Cho 2 đỉnh x1, x2X, nếu e = (x1,x2)E là cặp sắp thứ tự thì e được gọi

là một cung của đồ thị, hoặc nếu e là cặp không sắp thứ tự thì e được gọi là một cạnh của đồ thị.

- e = (x1,x2) là cung thì x1 là đỉnh đầu của cung, x2 là đỉnh cuối của cung e

- e = (x1,x2) là cạnh thì x1 và x2 là 2 đỉnh kề của cạnh e hoặc 2 đỉnh thuộc cạnh e

- Hai đỉnh x1 và x2 (x1 ≠ x2) của đồ thị được gọi là 2 đỉnh kề nhau nếu

chúng là 2 đầu của một cạnh hoặc một cung

- Hai cạnh a, b (hoặc 2 cung a, b) gọi là 2 cạnh kề nhau (hoặc 2 cung

kề nhau) nếu chúng có một đỉnh chung.

- Khuyên là cạnh (hoặc cung) có 2 đầu trùng nhau.

- Đỉnh treo là đỉnh thuộc duy nhất một cạnh hoặc cung.

- Đỉnh cô lập là đỉnh không thuộc cạnh hoặc cung nào.

c Phân loại đồ thị.

Cho đồ thị G = (X, E), nếu E chỉ gồm các cạnh thì G là đồ thị vô hướng Nếu E chỉ gồm các cung thì đồ thị G là đồ thị có hướng Nếu E gồm cả cạnh

và cung thì G là đồ thị hỗn hợp.

*Đa đồ thị: Đồ thị G = (X,E) vô hướng (hoặc có hướng) là đa đồ thị khi

và chỉ khi nó là đồ thị không khuyên và có ít nhất một cặp đỉnh được nối vớinhau bằng ít nhất 2 cạnh (hoặc 2 cung nối theo thứ tự của cặp đỉnh)

*Đơn đồ thị: Đồ thị G = (X,E) vô hướng (hoặc có hướng) là đơn đồ thị

khi và chỉ khi nó là đồ thị không khuyên và mỗi cặp đỉnh được nối với nhaukhông quá một cạnh (hoặc cung)

2.1.2 Biểu diễn đồ thị

Biểu diễn đồ thị trên máy tính theo cấu trúc nào thì sẽ có giải thuật theocấu trúc đó Với học sinh THPT, biểu diễn bằng ma trận (mảng 2 chiều) là dễhiểu và phù hợp nhất Sau đây ta sẽ tìm hiểu một số cách biểu diễn đồ thị:

a Biểu diễn bằng hình học

Minh họa cách biểu diễn

Trang 6

b Biểu diễn đồ thị bằng ma trận liên thuộc (Ma trận kề).

Giả sử đồ thị G = (X, E) có tập đỉnh X = (x1,x2, x3,…,xn), tập cạnh (hoặc cung) là E Ta xây dựng ma trận vuông A cấp n sao cho  i,j, 1i,jn có:

Ma trận A là ma trận liên thuộc (ma trận kề)

Nhận xét : Nếu G là đồ thị vô hướng thì Ma trận A sẽ đối xứng qua đường

chéo chính, Aij = Aji  i,j, 1i,jn

c Biểu diễn bằng ma trận trọng số.

Trong nhiều bài toán về đồ thị, mỗi cạnh (hoặc cung) e = (xi, xj) của đồthị thường được gắn với một số c (e) gọi là trọng số của cạnh (hoặc cung) e.Khi đó thường xây dựng ma trận vuông cấp n là ma trận C có mỗi phần tửC[i,j] = c(e) nếu tồn tại cạnh (hoặc cung) e = (xi, xj), ngược lại khi không cócạnh nối xi với xj thì C[i,j] =  (kí hiệu  là giá trị không xác định) Trongnhiều trường hợp, ngầm định C[i,i] = 0 với mọi đỉnh i trong đồ thị khôngkhuyên

1

Trang 7

Ví dụ:

G Đồ thị G biểu diễn sang ma trận

2.1.3 Tìm kiếm trên đồ thị và tìm thành phần liên thông trên đồ thị.

Hiểu được bản chất của các phép tìm kiếm và tìm thành phần liên thôngtrên đồ thị chúng ta có thể giải quyết được rất nhiều các dạng bài toán đặt ra.Qua tìm kiếm trên đồ thị chúng ta có thể kết hợp tính toán, thống kê, sắp xếp vàtổng hợp được các kết quả

a Một số khái niệm.

Định nghĩa 1: Đường đi có độ dài k (k nguyên dương) từ đỉnh u tới đỉnh v

trên đồ thị vô hướng G = (V, E) là dãy các đỉnh u = x0, x1, x2, x3,…, xk = v màcác cạnh (xi, xi+1)E, i=0,1,2,…,k-1 Đường đi này còn có thể biểu diễn dướidạng dãy các cạnh: (x0,x1), (x1,x2),….,(xk-1,xk) Đỉnh u gọi là đỉnh đầu (xuấtphát), đỉnh v gọi là đỉnh cuối (đỉnh đích) của đường đi Đường đi có đỉnh đầu

trùng với đỉnh cuối gọi là một chu trình.

Đường đi hay chu trình được gọi là đơn nếu không có cạnh nào bị lặp lại Đường đi hay chu trình được gọi là cơ bản nếu không có đỉnh nào bị lặp lại

(trừ trường hợp trong chu trình thì đỉnh đầu trùng đỉnh cuối là được lặp lại)

Định nghĩa 2: Đồ thị vô hướng G = (V, E) được gọi là liên thông nếu luôn

tìm được đường đi giữa 2 đỉnh bất kỳ của nó

Định nghĩa 3: Cho đồ thị vô hướng G = (V, E) và đồ thị con của G là đồ thị G‟

= (V‟, E‟) Đồ thị G‟ được gọi là một vùng liên thông (hoặc thành phần

liên thông) của G nếu:

+ G‟ liên thông;

+ Không tồn tại đường đi nào từ một đỉnh thuộc G‟ tới 1 đỉnh không thuộcG‟ (nói cách khác là bảo đảm tính tối đại của liên thông trong G‟)

Ví dụ: Trong hình dưới xét 2 đồ thị G và H: G chỉ có 1 vùng liên thông

duy nhất, H có 3 vùng liên thông là H1, H2, H3

Trang 8

thị liên thông khi và chỉ khi có một thành phần liên thông.

Trong hình trên có 4 thành phần liên thông (Đỉnh k đứng riêng lẻ theo quyước cũng tính là 1 thành phần liên thông)

b Tìm kiếm trên đồ thị.

Tìm kiếm trên đồ thị là duyệt (thăm) tất cả các đỉnh của đồ thị, mỗi đỉnhđúng 1 lần Rất nhiều thuật toán được xây dựng dựa trên cơ sở duyệt tất cả cácđỉnh của đồ thị sao cho mỗi đỉnh của nó được viếng thăm đúng 1 lần Vì vậy,việc xây dựng những thuật toán cho phép duyệt một cách hệ thống tất cả cácđỉnh của đồ thị là một vấn đề quan trọng Các thuật toán này giữ một vai tròquan trọng trong việc thiết kế các thuật toán trên đồ thị Có 2 thuật toán tìmkiếm cơ bản: Thuật toán tìm kiếm theo chiều sâu (DFS) và Thuật toán tìm

kiếm theo chiều rộng (BFS) Trong phạm vi đề tài này, tôi nghiên cứu và đưa

ra những bài toán đồ thị sử dụng thuật toán tìm kiếm theo chiều rộng (BFS).

c Tìm đường đi và kiểm tra tính liên thông.

Tìm đường đi và kiểm tra tính liên thông là một hình thức ứng dụng cácthuật toán tìm kiếm trên đồ thị Đường đi tìm được theo thuật toán tìm kiếmtheo chiều rộng là đường đi ngắn nhất (theo số cạnh) từ đỉnh s đến đỉnh t.Trong các ứng dụng thực tế: Bài toán tìm đường đi ngắn nhất giữa 2 đỉnh củamột đồ thị liên thông có một ý nghĩa to lớn Có thể dẫn về bài toán như vậynhiều bài toán thực tế quan trọng Ví dụ, Bài toán chọn một hành trình tiếtkiệm nhất (theo tiêu chuẩn khoảng cách hoặc thời gian hoặc chi phí) trên một

G

Trang 9

mạng giao thông đường bộ, đường thủy hoặc đường không; bài toán chọn mộtphương pháp tiết kiệm để đưa một hệ động lực từ trạng thái xuất phát đếntrạng thái đích, bài toán lập lịch thi công các công đoạn trong công trình.

2.2 Thực trạng của vấn đề

2.2.1 Thuận lợi

Lý thuyết đồ thị có thể giải quyết được nhiều bài toán đặt ra trong thực tếphù hợp với đối tượng học sinh giỏi Tin học, đặc biệt là những bài toán thểhiện quan hệ nhị phân giữa các đối tượng rời rạc Vận dụng lý thuyết đồ thịgiúp học sinh có thêm một luồng kiến thức mới để làm giàu hơn tư duy thuậttoán của mình Có khá nhiều tài liệu giới thiệu về các vấn đề liên quan đến lýthuyết đồ thị như: sách cấu trúc dữ liệu và giải thuật, Sách Toán rời rạc,…vàcác tài liệu trên mạng Internet

Giáo viên và học sinh phát huy được tính năng động trong quá trình dạyhọc đạt kết quả cao hơn Một số kiến thức dễ sử dụng và hiệu quả cao Ví dụ:phép tìm kiếm và kiểm tra vùng liên thông trên đồ thị

- Đưa ra các giải thuật bằng ngôn ngữ C++ để minh hoạ các kiến thức

- Đưa ra hệ thống các dạng bài tập có thể giải quyết hiệu quả bằng lýthuyết đồ thị và cách giải các bài tập đó

- Để khắc phục được một phần khó khăn nêu trên, trong đề tài tôi chỉ đềcập đến những phần quan trọng của lý thuyết đồ thị có ứng dụng nhiều trongthực tế và phù hợp với học sinh THPT, đặc biệt là học sinh ôn luyện học sinhgiỏi tin học

2.3 BFS và bài tập ứng dụng

2.3.1 Thuật toán duyệt đồ thị ưu tiên chiều rộng

Thuật toán duyệt đồ thị ưu tiên chiều rộng (Breadth-first search - BFS) là

một trong những thuật toán tìm kiếm cơ bản và thiết yếu trên đồ thị Mà trong

đó, những đỉnh nào gần đỉnh xuất phát sớm hơn sẽ được duyệt trước

Ứng dụng của BFS có thể giúp ta giải quyết tốt một số bài toán trong thờigian và không gian tối thiểu Đặc biệt là bài toán tìm kiếm đường đi ngắn nhất từmột đỉnh gốc tới tất cả các đỉnh khác Trong đồ thị không có trọng số hoặc tất cảtrọng số bằng nhau, thuật toán sẽ luôn trả ra đường đi ngắn nhất có thể Ngoài

ra, thuật toán này còn được dùng để tìm các thành phần liên thông của đồ thị,hoặc kiểm tra đồ thị hai phía, …

đồ thị có hướng hoặc vô hướng, điều đó không quan trọng đối với thuật toán

Có thể hiểu thuật toán như một ngọn lửa lan rộng trên đồ thị:

 Ở bước thứ 0, chỉ có đỉnh nguồn s đang cháy

 Ở mỗi bước tiếp theo, ngọn lửa đang cháy ở mỗi đỉnh lại lan sang tất cảcác đỉnh kề với nó

Trang 10

Trong mỗi lần lặp của thuật toán, "vòng lửa" lại lan rộng ra theo chiềurộng Những đỉnh nào gần s hơn sẽ bùng cháy trước Chính xác hơn, thuật toán

có thể được mô tả như sau:

 Đầu tiên ta thăm đỉnh nguồn s

 Việc thăm đỉnh s sẽ phát sinh thứ tự thăm các đỉnh (u1,u2,…up) ( v1,v2,

…,vq) kề với s (những đỉnh gần s nhất) Tiếp theo, ta thăm đỉnh u1, khi thămđỉnh u1 sẽ lại phát sinh yêu cầu thăm những đỉnh (v1,v2,…,vq) (v1,v2,…,vq) kềvới u1 Nhưng rõ ràng những đỉnh v này “xa” s hơn những đỉnh u nên chúng chỉđược thăm khi tất cả những đỉnh u đều đã được thăm Tức là thứ tự thăm cácđỉnh sẽ là: s, u1,u2,…up, v1,v2,…,vq,…

Thuật toán tìm kiếm theo chiều rộng sử dụng một danh sách để chứa nhữngđỉnh đang “chờ” thăm Tại mỗi bước, ta thăm một đỉnh đầu danh sách, loại nó rakhỏi danh sách và cho những đỉnh kề với nó chưa được thăm xếp hàng vào cuốidanh sách Thuật toán sẽ kết thúc khi danh sách rỗng

Thuật toán: sử dụng một cấu trúc dữ liệu hàng đợi (queue) để chứa các

đỉnh sẽ được duyệt theo thứ tự ưu tiên chiều rộng

Bước 1: Khởi tạo

 Các đỉnh đều ở trạng thái chưa được đánh dấu Ngoại trừ đỉnh nguồn s đãđược đánh dấu

 Một hàng đợi ban đầu chỉ chứa 1 phần tử là s

Bước 2: Lặp lại các bước sau cho đến khi hàng đợi rỗng:

 Lấy đỉnh u ra khỏi hàng đợi

 Xét tất cả những đỉnh v kề với u mà chưa được đánh dấu, với mỗiđỉnh v đó:

- Đánh dấu v đã thăm

- Lưu lại vết đường đi từ u đến v

- Đẩy v vào trong hàng đợi (đỉnh v sẽ chờ được duyệt tại những bước sau)

Bước 3: Truy vết tìm đường đi.

Trang 11

Mô tả : Xét đồ thị sau đây, với đỉnh nguồn s=1 :

Cài đặt

int n; // Số lượng đỉnh của đồ thị

int d[maxN] ; // Mảng lưu khoảng cách từ đỉnh nguồn đến mọi đỉnh

int par [maxN] ; // Mảng lưu lại vết đường đi

bool visit[maxN]; // Mảng đánh dấu các đỉnh đã thăm

vector < int > g[maxN];

void bfs(int s) { // Với s là đỉnh xuất phát (đỉnh nguồn)

fill_n(d, n + 1, 0);

fill_n(par, n + 1, -1);

fill_n(visit, n + 1, false); // gán tất cả phần tử ở mảng visit là chưa được thăm

queue < int > q;

q.push(s); // đẩy s vào queue

visit[s] = true; // đỉnh s đã được thăm

while (!q.empty()) // trong khi q chưa rỗng

par[v] = u; // lưu vết đỉnh trước của v là u

visit[v] = true; // đỉnh v đã được thăm

q.push(v); } } // đẩy v vào queue

Ngày đăng: 17/06/2024, 08:51

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w