Tải bản đầy đủ (.doc) (23 trang)

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

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 (471.71 KB, 23 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

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

<b>TRƯỜNG THPT CHU VĂN AN</b>

SÁNG KIẾN KINH NGHIỆM

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

<b>BÀI TOÁN ĐỒ THỊ TRONG TIN HỌC</b>

<b>Người thực hiện: Nguyễn Thị HằngChức vụ: Giáo viên</b>

<b>SKKN thuộc lĩnh vực (mơn): Tin học</b>

THANH HỐ NĂM 2024

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

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

<b>II. Phần nội dung...3</b>

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

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ơngtrọng số...18

<b>III. Kết quả và kiến nghị đề xuất...19</b>

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

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

<b>Tài liệu tham khảo </b>

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

<b>I. Phần mở đầu</b>

<b>1.1. Lý do chọn đề tài</b>

<b>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</b>

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 chun đề 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 qt 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 đạibộ 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ứcvà á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 tốnthường được áp dụng trong các bài tố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 tố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ệmvụ 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 TỐ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 q thầy cơ trong q 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.

<b>1.2. Mục đích nghiên cứu</b>

*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 tố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.

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

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

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

<b>1.3. Đối tượng nghiên cứu</b>

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.

<b>1.4. Phương pháp nghiên cứu</b>

<i><b>a. Nghiên cứu lý luận.</b></i>

- 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.

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

Đề 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 tố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 tố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ị.

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

<b>II. Phần nội dung</b>

<b>2.1. Cơ sở lý luận của sáng kiến kinh nghiệm2.1.1. Đồ thị và tầm quan trọng</b>

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 quyvề mơ hình đồ thị.

<b>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</b>

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

<b>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.</b>

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

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

<b>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ị.</b>

- e = (x<small>1</small>,x<small>2</small><b>) là cung thì x</b><small>1</small> là đỉnh đầu của cung, x<small>2</small> là đỉnh cuối của cung e.- e = (x<small>1</small>,x<small>2</small><b>) là cạnh thì x1 và x</b><small>2</small> là 2 đỉnh kề của cạnh e hoặc 2 đỉnh thuộc cạnh e.- Hai đỉnh x<small>1</small> và x<small>2</small> (x<small>1</small> ≠ x<small>2</small><b>) của đồ thị được gọi là 2 đỉnh kề nhau nếu</b>

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

<b>- Hai cạnh a, b (hoặc 2 cung a, b) gọi là 2 cạnh kề nhau (hoặc 2 cungkề nhau) nếu chúng có một đỉnh chung.</b>

<b>- 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ị.</b>

<b>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ạnhvà cung thì G là đồ thị hỗn hợp.</b>

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

và chỉ khi nó là đồ thị khơng khun 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).

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

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

<b>2.1.2. Biểu diễn đồ thị</b>

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ị:

<b>a. Biểu diễn bằng hình họcMinh họa cách biểu diễn</b>

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

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

Giả sử đồ thị G = (X, E) có tập đỉnh X = (x<small>1</small>,x<small>2</small>, x<small>3</small>,…,x<small>n</small>), 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ề)

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

chéo chính, A<small>ij</small> = A<small>ji</small>  i,j, 1i,jn.

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

Trong nhiều bài toán về đồ thị, mỗi cạnh (hoặc cung) e = (x<small>i</small>, x<small>j</small>) 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 vng 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 = (x<small>i</small>, x<small>j</small>), ngược lại khi khơng cócạnh nối x<small>i</small> với x<small>j</small> 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ơngkhun.

<small>1</small>

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

<b>Ví dụ:</b>

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

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

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 tốn đặt ra.Qua tìm kiếm trên đồ thị chúng ta có thể kết hợp tính tốn, thống kê, sắp xếp vàtổng hợp được các kết quả.

<b>a. Một số khái niệm.</b>

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

trên đồ thị vô hướng G = (V, E) là dãy các đỉnh u = x<small>0</small>, x<small>1</small>, x<small>2</small>, x<small>3</small>,…, x<small>k</small> = v màcác cạnh (x<small>i</small>, x<small>i+1</small>)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: (x<small>0</small>,x<small>1</small>), (x<small>1</small>,x<small>2</small>),….,(x<small>k-1</small>,x<small>k</small>). Đỉ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

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

<b>Đườ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</b>

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

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

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‟

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

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‟).

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

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

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

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

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>b. Tìm kiếm trên đồ thị.</b>

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 tốn này giữ một vai trịquan trọng trong việc thiết kế các thuật tốn trên đồ thị. Có 2 thuật tốn tìmkiếm cơ bản: Thuật tốn tìm kiếm theo chiều sâu (DFS) và Thuật toán tìm

<i>kiếm theo chiều rộng (BFS). Trong phạm vi đề tài này, tơi nghiên cứu và đưara những bài tốn đồ thị sử dụng thuật tốn tìm kiếm theo chiều rộng (BFS).</i>

<b>c. Tìm đường đi và kiểm tra tính liên thơng.</b>

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 tốn tìm kiếm trên đồ thị. Đường đi tìm được theo thuật tố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 tố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 tốn như vậynhiều bài tốn thực tế quan trọng. Ví dụ, Bài tố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

<b><small>G</small></b>

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

mạng giao thông đường bộ, đường thủy hoặc đường khơng; bài tố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 tốn lập lịch thi cơng các cơng đoạn trong cơng trình.

<b>2.2. Thực trạng của vấn đề2.2.1. Thuận lợi</b>

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ậttố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 q 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ị.

- Để 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.

<b>2.3. BFS và bài tập ứng dụng</b>

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

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

một trong những thuật tố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 tố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ẽ ln trả ra đường đi ngắn nhất có thể. Ngồira, thuật tố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 tốn.Có thể hiểu thuật toán như một ngọn lửa lan rộng trên đồ thị:

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

<small></small> Ở 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ó.

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

Trong mỗi lần lặp của thuật tố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 tốncó thể được mơ tả như sau:

<small></small> Đầu tiên ta thăm đỉnh nguồn s.

<small></small> Việc thăm đỉnh s sẽ phát sinh thứ tự thăm các đỉnh (u<small>1</small>,u<small>2</small>,…u<small>p</small>) ( v<small>1</small>,v<small>2</small>,…,v<small>q</small>) kề với s (những đỉnh gần s nhất). Tiếp theo, ta thăm đỉnh u<small>1</small>, khi thămđỉnh u<small>1</small> sẽ lại phát sinh yêu cầu thăm những đỉnh (v<small>1</small>,v<small>2</small>,…,v<small>q</small>) (v<small>1</small>,v<small>2</small>,…,v<small>q</small>) kềvới u<small>1</small>. 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, u<small>1</small>,u<small>2</small>,…up, v<small>1</small>,v<small>2</small>,…,v<small>q</small>,…

Thuật tố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.

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

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

<b>Bước 1: Khởi tạo</b>

<small></small> 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.

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

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

<small></small> Lấy đỉnh u ra khỏi hàng đợi.

<small></small> 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>Bước 3: Truy vết tìm đường đi.</b>

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

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

<b>Cài đặt</b>

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

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

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

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

<b>vector <int> g[maxN];</b>

<b>voidbfs</b>(<b>int</b> s) { // Với s là đỉnh xuất phát (đỉnh nguồn)

<b> fill_n(d, n + </b>1, 0);

<b> fill_n(par, n + </b>1<b>, -</b>1);

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

<b> queue <int> q; </b>

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

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

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

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

<b> visit[v] = </b>true<i>; // đỉnh v đã được thăm q.push(v); } } // đẩy v vào queue</i>

</div>

×