Đồ thị có trọng số trên các cạnh có thể sử dụng đểgiải các bài toán như: Tìm đường đi ngắn nhất giữa hai thành phố trong một mạng lướigiao thông; Lập lịch sửa chữa các tuyến đường sao ch
Trang 2Đồng Hới, tháng 01 năm 2019
Trang 31 PHẦN MỞ ĐẦU
1.1 Lý do chọn đề tài
Như ta đã biết, muốn giải một bài toán trong Tin học thì việc tìm ra ý tưởng giảithuật là một điều bắt buộc phải làm, không kém quan trọng và đi kèm với việc đó làphải biết lựa chọn cấu trúc dữ liệu phù hợp với ý tưởng giải thuật đó nhằm tối ưu hóabài toán
Chuyên đề về đồ thị là một trong những chuyên đề cơ bản khi giảng dạy cho họcsinh ở lớp chuyên Tin Với rất nhiều bài toán trên thực tế ta có thể mô hình hóa, đưa
về cấu trúc trên đồ thị để giải quyết Đồ thị có trọng số trên các cạnh có thể sử dụng đểgiải các bài toán như: Tìm đường đi ngắn nhất giữa hai thành phố trong một mạng lướigiao thông; Lập lịch sửa chữa các tuyến đường sao cho vẫn đảm bảo lưu thông giữacác khu dân cư, Lâp kế hoạch lắp đặt hệ thống điện sao cho tiết kiệm chi phí nhất
Để khai thác các tính chất của đồ thị trong việc giải quyết một số bài toán thực tế, thìcác bài toán có thể giải dựa trên tính chất liên thông của đồ thị là một lĩnh vực rất quantrọng Trong các bài toán đó có bài toán “Tìm cây khung của một đồ thị vô hướng liênthông” được lựa chọn và đưa vào giảng dạy cho khối lớp chuyên Tin của trườngTHPT Chuyên Võ Nguyên Giáp
Đó là lí do tôi chọn đề tài: “Bài toán tìm cây khung trên đồ thị vô hướng” làm
đề tài nghiên cứu cho sáng kiến kinh nghiệm của mình
1.2 Điểm mới của đề tài
“Bài toán tìm cây khung trên đồ thị vô hướng” là một trong những chuyên đề
cơ bản và quan trọng khi bồi dưỡng học sinh giỏi Tin học trong nhà trường làchuyên đề về lý thuyết đồ thị và các thuật toán trên đồ thị Có nhiều dạng đồ thị,nhiều dạng bài toán và thuật toán trên đồ thị Một bài toán tối ưu và nổi tiếng về đồthị là bài toán tìm cây khung, cây khung cực tiểu
Giải pháp được đặt ra là sử dụng thuật toán tìm cây khung, cây khung cực tiểu
để giải các bài toán đặc trưng của nó đồng thời áp dụng thuật toán cho lớp bài toán
cơ bản nhất như kiểm tra tính liên thông của đồ thị, đếm số thành phần liên thôngcủa đồ thị Khi sử dụng thuật toán này để quay trở lại giải quyết các bài toán cơbản nói trên sẽ cho học sinh có định hướng tốt trong việc phân tích, lựa chọn thuậttoán phù hợp, tốt nhất để thiết kế, cài đặt cho mỗi bài toán
Trang 42 PHẦN NỘI DUNG
2.1 Thực trạng
Trong toán học và tin học, lý thuyết đồ thị nghiên cứu các tính chất của đồ thị.Một cách không chính thức, đồ thị là một tập các đối tượng được gọi là các đỉnh (hoặcnút) nối với nhau bởi các cạnh (hoặc cung) Cạnh có thể có hướng hoặc vô hướng Đồthị thường được vẽ dưới dạng một tập các điểm (các đỉnh nối với nhau bằng các đoạnthẳng (các cạnh) Những ý tưởng cơ bản của đồ thị được đưa ra từ thế kỷ thứ XVIIIbởi nhà toán học Thụy Sĩ Leonhard Euler, ông đã dùng mô hình đồ thị để giải bài toán
về những cây cầu Konigsberg nổi tiếng
Mặc dù lý thuyết đồ thị đã được khoa học phát triển từ rất lâu nhưng lại cónhiều ứng dụng hiện đại Đặc biệt trong khoảng vài mươi năm trở lại đây, cùng với sự
sự phát triển nhanh chóng của Công nghệ thông tin, Lý thuyết đồ thị càng được quantâm nghiên cứu đến nhiều hơn Hiện nay, môn học này là một trong những kiến thức
cơ sở của bộ môn khoa học máy tính Đặc biệt là các thuật toán trên đồ thị đã có nhiềuứng dụng trong nhiều lĩnh vực khác nhau như: Mạng máy tính, Bưu chính viễn thông,Tối ưu hoá, Giao thông vận tải, v.v
Ở trường THPT Chuyên Võ Nguyên Giáp thì vấn đề bồi dưỡng học sinh giỏi,bồi dưỡng giáo viên là một trong những vấn đề được quan tâm hàng đầu Đặc biệt làcác lớp ở khối chuyên Tin thì yêu cầu học sinh không những phải nắm vững các kiếnthức về tư duy thuật toán mà còn phải biết sử dụng ngôn ngữ lập trình thành thạo vàcác cấu trúc dữ liệu hợp lí để có thể giải được các bài toán trong Tin học
Như ta đã biết: "Thuật toán + Cấu trúc dữ liệu + Ngôn ngữ lập trình = Chươngtrình" Như vậy, một trong những công việc không kém phần quan trọng để lập trìnhgiải một bài toán trong Tin học đó là việc lựa chọn cấu trúc dữ liệu hợp lí Do đó họcsinh cần phải biết cách khai thác và sử dụng cấu trúc dữ liệu một cách hợp lí Từ việcxác định được cấu trúc dữ liệu cần sử dụng, học sinh hình thành tư duy thuật toán, lựachọn được thuật toán tối ưu để giải quyết từng bài toán cụ thể
Trang 52.2 Một số định nghĩa liên quan đến lý thuyết đồ thị
Định nghĩa đơn đồ thị vô hướng
Đơn đồ thị vô hướng G = (V, E) bao gồm V là tập các đỉnh, và E là tập các cặp không có thứ tự gồm hai phần tử khác nhau của V gọi là các cạnh.
Định nghĩa các đỉnh và cạnh của đồ thị vô hướng
Hai đỉnh u và v của đồ thị vô hướng G được gọi là kề nhau nếu (u, v) là cạnh của đồ thị G Nếu e=(u, v) là cạnh của đồ thị thì ta nói cạnh này liên thuộc với hai đỉnh
u và v, hoặc cũng nói là cạnh e là nối đỉnh u và đỉnh v, đồng thời các đỉnh u và v sẽ
được gọi là các đỉnh đầu của cạnh (u, v).
Định nghĩa bậc của một đỉnh trong đồ thị vô hướng
Ta gọi bậc của đỉnh v trong đồ thị vô hướng là số cạnh liên thuộc với nó và sẽ
ký hiệu là deg(v).
Định nghĩa đường đi trong đồ thị vô hướng
Đường đi độ dài n từ đỉnh u đến đỉnh v, trong đó n nguyên dương, trên đồ thị vô
hướng G = (V, E) là dãy x 0 , x 1 , x 2 , , x n-1 , x n trong đó:
Định nghĩa chu trình trong đồ thị vô hướng
Đường đi độ dài n từ đỉnh u đến đỉnh v, trong đó n nguyên dương, trên đồ thị vô
hướng G = (V, E) là dãy x 0 , x 1 , x 2 , , x n-1 , x n trong đó:
u = x 0 , v = x n , (x i , x i+1 ) E , i = 0, 1, 2, 3 n-1.
2 1
3
4 5
3
4 5
6
Trang 6Đỉnh u gọi là đỉnh đầu, còn đỉnh v gọi là đỉnh cuối của đường đi Đường đi có
đỉnh đầu trùng với đỉnh cuối (tức là u = v) được gọi là chu trình Chu trình được gọi là
đơn nếu như không có cạnh nào bị lặp lại
Định nghĩa liên thông trong đồ thị vô hướng
Đồ 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 hai đỉnh bất kỳ của đồ thị
Định nghĩa thành phần liên thông trong đồ thị vô hướng
Ta gọi đồ thị con của dồ thị G = (V, E) là đồ thị H = (W, F) trong đó:
W V và FE
Trong trường hợp đồ thị là không liên thông, nó sẽ rã ra một số đồ thị con liênthông đôi một không có đỉnh chung Những đồ thị con liên thông như vậy ta sẽ gọi làcác thành phần liên thông của đồ thị
Định nghĩa Cây trong đồ thị vô hướng
Ta gọi cây T = (V, E) là đồ thị vô hướng liên thông không có chu trình Đồ thị
không có chu trình được gọi là rừng
Định nghĩa cây khung trong đồ thị vô hướng
Cho G = (V, E) là đồ thị vô hướng liên thông Cây T = (V, F) với F Eđượcgọi là cây khung của đồ thị
2.3 Bài toán tìm cây khung
2.3.1 Bài toán thực tế
Xây cầu nối giữa các đảo BRIDGE.???
Chủ đầu tư đang xây dựng một đặc khu kinh tế trên một quần đảo Quần đảo có
n đảo được đánh số từ 1, 2, n Trên các đảo đã được xây dựng xong cơ sở vật chất
hạ tầng phục vụ cho đời sống cũng như phát triển kinh tế Tuy nhiên giữa các đảochưa được xây dựng chiếc cầu nào để nối giữa chúng nên việc đi lại giữa các đảo là rấtvất vả, đặc biệt là trong mua mưa bão Để thu hút các nhà đầu tư đưa vốn phát triểnđặc khu, Chủ đầu tư quyết định lập dự án xây dựng những cây cầu nối giữa các đảotrong đặc khu nhằm thúc đẩy sự phát triển kinh tế cũng như du lịch Đơn vị thi công
đã khảo sát địa hình và cho Chủ đầu tư biết địa hình địa chất nơi đây đảm bảo có thểxây dựng được một số cây cầu nối trực tiếp giữa các đảo, khi xây dựng xong đảm bảongười dân giữa các đảo đi đến được với nhau bằng các cây cầu đã xây dựng
Do không đủ nguồn vốn để xây dựng tất cả các cây cầu cùng một lúc, Chủ đầu
tư quyết định xây dựng một số cầu trong giai đoạn 1 sao cho đảm bảo người dân ở mộtđảo có thể đến được các đảo còn lại bằng các chiếc cầu mới xây dựng
Yêu cầu: Hãy giúp Chủ đầu tư lập kế hoạch xây dựng một số cầu ít nhất nhưng vẫn
đảm bảo người dân ở một đảo có thể đến được các đảo còn lại
Trang 7Dữ liệu vào: Cho trong file BRIDGE.INP có cấu trúc:
- Dòng 1: Ghi số nguyên dương n, là số lượng đảo trong đặc khu (2 ≤ n ≤ 100).
- Dòng thứ i trong n dòng tiếp theo: Mỗi dòng ghi n số 0 hoặc 1, số thứ j = 1 thể hiện
có thể xây được cầu nối trực tiếp giữa đảo i với đảo j (1 ≤ i, j ≤ n)
Dữ liệu ra: Ghi ra file văn bản BRIDGE.OUT theo cấu trúc:
- Dòng 1: Ghi số nguyên dương k, là số cầu cần phải xây dựng
- k dòng tiếp theo: Mỗi dòng ghi 2 số p, q thể hiện việc cần xây dựng cầu nối giữa đảo
p với đảo q Hai số được ghi cách nhau một dấu cách
2.3.2 Đưa bài toán về mô hình đồ thị
Với bài toán thực tế ở trên, ta có thể mô hình hóa về đồ thị vô hướng như sau:
- Gọi mỗi đảo là một đỉnh của đồ thị
- Gọi mỗi cây cầu nối trực tiếp giữa hai đảo là một cạnh của đồ thị
Từ ví dụ cụ thể đã cho ở trên ta có đồ thị G = (V, E) sau đây:
khung T = (V, F) với FE
3
4 5
6
Trang 8Vậy thuật toán để giải bài toán này chính là thuật toán tìm cây khung T = (V, F) trên đồ thị G = (V, E), G là đồ thị liên thông.
Có nhiều thuật toán để giải quyết bài toán tìm cây khung, nhưng ta chọn thuậttoán duyệt theo chiều sâu (DFS) hoặc duyệt theo chiều rộng (BFS)
Sau đây ta xây dựng thuật toán duyệt theo chiều sâu để giải quyết:
Thủ tục Solution dùng để tìm cây khung T:
Procedure Solution
Begin
T = While E do
Begin
- Lấy cạnh eu v, trong tập cạnh E của đồ thị G.
- Dùng thủ tục BFS(u, v) để tìm đường đi từ u đến v trong cây khung T = (V, F), nếu không tồn tại đường đi từ u đến v
thì: Nạp cạnh eu v, vào cây khung T (nạp cạnh e vào tập cạnh F của cây khung T).
- Loại bỏ cạnh eu v, ra khỏi tập cạnh E của đồ thị G.
End;
End;
Hàm BFS(u, v) dùng để kiểm tra khi kết nạp thêm một cạnh eu v, vào cây
khung T = (V, F) có tạo thành chu trình hay không.
Trang 9- Dùng mảng Stack: array[1 max] of Integer để sử dụng thuật toán DFS trong việc kiểm tra chu trình khi muốn nạp thêm một cạnh e = (Q[i], P[i]) vào cây khung T.
B: array[1 Max, 1 Max] of Integer;
Free: array[1 Max] of Boolean;
Stack: array[1 Max] of Integer;
Trang 122.4 Bài toán tìm cây khung cực tiểu
Bài toán cây khung nhỏ nhất của đồ thị là một trong số những bài toán tối ưutrên đồ thị tìm được ứng dụng trong nhiều lĩnh vực khác nhau của đời sống Trongmục này ta sẽ tìm hiểu bài toán thực tế, đưa bài toán về mô hình đồ thị, xây dựng vàlựa chọn thuật toán để giải quyết bài toán đặt ra
Phát biểu bài toán tổng quát:
Cho G = (V, E) là đồ thị vô hướng liên thông với tập đỉnh V = {1, 2,3, , }n và
tập các cạnh E gồm m cạnh Mỗi cạnh e của đồ thị G được gán với một số thực c(e), gọi là độ dài của nó Giả sử T = (V, F) là cây khung của đồ thị G Ta gọi độ dài c(T) của cây khung T là tổng độ dài các cạnh của nó:
Trang 132.4.1 Bài toán thực tế
Tỉnh đoàn Q tổ chức cắm trại nhân dịp kỹ niệm ngày thành lập đoàn 26-3 Theo
kế hoạch sẽ có n trại tham gia gồm một trại trung tâm của Ban tổ chức và trại của các
đơn vị, tất cả các trại được đánh số thứ tự từ 1, 2, , n Ban tổ chức đã chọn được địađiểm, khảo sát và lập bản đồ bố trí các trại, trong bản đồ có ghi rõ khoảng cách trựctiếp giữa các trại để lắp đặt hệ thống dây điện Khoảng cách giữa các trại được thể
hiện trong ma trận A kích thước n×n, trong đó A[i, j] là khoảng cách từ trại i đến trại j.
Vấn đề đặt ra là Ban tổ chức muốn lắp đặt hệ thống dây điện đảm bảo an toàn
và tiết kiệm chi phí nhất
Yêu cầu: Hãy lập kế hoạch lắp đặt hệ thống dây điện từ trại trung tâm đến các trại sao
cho đảm bảo các trại đều có nguồn điện đến tận trại mình và tổng chiều dài dây điệncần lắp đặt là nhỏ nhất
Dữ liệu vào: Cho trong file CAMP.INP có cấu trúc:
- Dòng 1: Ghi số nguyên dương n, là số lượng trại tham gia (2 ≤ n ≤ 100).
- Dòng thứ i trong n dòng tiếp theo: Mỗi dòng ghi n số nguyên, số thứ j có giá trị là k thể hiện giữa trại i với trại j có thể nối dây điện trực tiếp với nhau và độ dài dây nối là
k, nếu k = 0 tức là không thể nối dây điện trực tiếp giữa trị i với trại j (1 ≤ i, j ≤ n; 0 ≤
k ≤ 32000)
Dữ liệu ra: Ghi ra file văn bản CAMP.OUT theo cấu trúc:
- Dòng 1: Ghi số nguyên dương d, là tổng độ dài dây điện cần lắp đặt.
- d dòng tiếp theo: Mỗi dòng ghi 3 số p, q, k thể hiện việc cần nối dây điện trực tiếp giữa trại p với trại q và độ dài dây nối là k Các số được ghi cách nhau một dấu cách.
Trang 142.4.2 Đưa bài toán về mô hình đồ thị
Với bài toán thực tế ở trên, ta có thể mô hình hóa về đồ thị vô hướng như sau:
- Gọi mỗi trại là một đỉnh của đồ thị
- Gọi mỗi đường nối dây điện trực tiếp giữa hai trại là một cạnh của đồ thị
Từ ví dụ cụ thể đã cho ở trên ta có đồ thị G = (V, E) sau đây:
Sau khi sử dụng thuật toán Kruskal để tìm cây khung cực tiểu thì ta sẽ có cây khung:
2.4.3 Thuật toán
Thuật toán Kruskal
Xây dựng tập cạnh F của cây khung cực tiểu T = (V, F) theo từng bước:
1 Sắp xếp các cạnh e Ecủa đồ thị G theo thứ tự tăng dần của c(e).
2 Bắt đầu từ tập F = , mỗi bước ta lấy trong tập E một cạnh theo thứ tự đã được sắp xếp từ cạnh có độ dài nhỏ đến độ dài lớn hơn, để chọn ra một cạnh e mà việc
bổ sung cạnh e vào tập F không tạo thành chu trình.
3 Thuật toán kết thúc khi ta tìm được tập F có đúng n - 1 cạnh, cụ thể:
Procedure Kruskal
Begin
F =
While (E ≠ ) and ( F n 1) doBegin
Chọn cạnh e Elà nhỏ nhất còn lại trong E;
15 gg g
7
9
19 5
6
8
15 gg g
7
9
11 5 8
6
Trang 15B: array[1 max, 1 max] of Integer;
Free: array[1 max] of Boolean;
Stack: array[1 max] of Integer;
Trang 233 KẾT LUẬN
3.1 Ý nghĩa, phạm vi áp dụng
Qua quá trình nghiên cứu và thực hiện, về cơ bản đề tài đã hoàn thành và đã đạtđược những kết quả sau:
- Tìm hiểu và trình bày về bài toán tìm cây khung, cây khung cực tiểu;
- Tìm hiểu và trình bày về thuật toán, giải bài toán tìm cây khung, bài toán tìm câykhung cực tiểu;
- Trình bày được phương pháp tư duy phân tích bài toán, đưa bài toán thực tế về môhình đồ thị để giải quyết;
- Viết được chương trình để giải các bài toán thực tế đã trình bày trong đề tài
Trong đề tài tôi đã trình bày nhiều thuật toán tìm cây khung và cây khung cựctiểu để học sinh có thể lựa chọn, phân tích độ phức tạp của mỗi thuật toán Từ đó hìnhthành tư duy, kỹ năng giải quyết các vấn đề liên quan đến thuật toán đã được học
Đề tài đã trình bày thuật toán DFS để tìm cây khung, cây khung cực tiểu từ đóhọc sinh tiếp cận và có thể nghiên cứu và sử dụng thuật toán tương tự là BFS để giảiquyết bài toán đặt ra Qua đây học sinh ngoài việc nắm bắt được khả năng vận dụngthuật toán cơ bản để giải quyết các lớp bài toán khác nhau mà một lần nữa học sinhđược củng cố, khắc sâu kiến thức đã được học
“Bài toán tìm cây khung trên đồ thị vô hướng” được áp dụng trong việc dạy
cho học sinh khối chuyên Tin, bồi dưỡng học sinh giỏi Tin học, tài liệu đọc thêm chocác em học sinh yêu thích việc lập trình cũng như bộ môn Tin học Đề tài được sửdụng cho các giáo viên dạy Tin học tham khảo, nâng cao khả năng tư duy thuật toáncũng như khả năng lập trình của bản thân, từ đó nâng cao chất lượng dạy và học bộmôn Tin học
3.2 Những kiến nghị, đề xuất
Với thuật toán Kruskal học sinh không chỉ sử dụng để tìm cây khung cực tiểu
mà còn có thể vận dụng để giải lớp vấn đề liên quan đến kiểm tra tính liên thông của
đồ thị, đếm số thành phần liên thông của đồ thị
Có hai thuật toán tốt, tối ưu để tìm cây khung cực tiểu đó là Kruskal và Prim.Mỗi thuật toán sử dụng một mô hình toán học khác nhau Tuy nhiên, trong đề tài nàytôi chỉ trình bày thuật toán tối ưu Kruskal còn thuật toán Prim là một hướng mới đểhướng dẫn học sinh tự nghiên cứu, tìm hiểu Khi các học sinh tìm hiểu thuật toán Primrồi thì từ đó các em có thể tự gđánh giá được điểm mạnh, điểm hạn chế của mỗi thuật