Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 27 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
27
Dung lượng
227 KB
Nội dung
CỘNG HÒA Xà HỘI CHỦ NGHĨA VIỆT NAM Độc lập - Tự - Hạnh phúc TÊN ĐỀ TÀI: BÀI TỐN TÌM CÂY KHUNG TRÊN ĐỒ THỊ VƠ HƯỚNG Đồng Hới, tháng 01 năm 2019 CỘNG HÒA Xà HỘI CHỦ NGHĨA VIỆT NAM Độc lập - Tự - Hạnh phúc TÊN ĐỀ TÀI: BÀI TỐN TÌM CÂY KHUNG TRÊN ĐỒ THỊ VÔ HƯỚNG Họ tên: Trần Lương Vương Chức vụ: Tổ trưởng chuyên môn Đơn vị công tác: Trường THPT Chuyên Võ Nguyên Giáp Đồng Hới, tháng 01 năm 2019 PHẦN MỞ ĐẦU 1.1 Lý chọn đề tài Như ta biết, muốn giải tốn Tin học việc tìm ý tưởng giải thuật điều bắt buộc phải làm, không quan trọng kèm với việc phải biết lựa chọn cấu trúc liệu phù hợp với ý tưởng giải thuật nhằm tối ưu hóa tốn Chun đề đồ thị chuyên đề giảng dạy cho học sinh lớp chuyên Tin Với nhiều tốn thực tế ta mơ hình hóa, đưa cấu trúc đồ thị để giải Đồ thị có trọng số cạnh sử dụng để giải tốn như: Tìm đường ngắn hai thành phố mạng lưới giao thông; Lập lịch sửa chữa tuyến đường cho đảm bảo lưu thông khu dân cư, Lâp kế hoạch lắp đặt hệ thống điện cho tiết kiệm chi phí Để khai thác tính chất đồ thị việc giải số tốn thực tế, tốn giải dựa tính chất liên thông đồ thị lĩnh vực quan trọng Trong tốn có tốn “Tìm khung đồ thị vô hướng liên thông” lựa chọn đưa vào giảng dạy cho khối lớp chuyên Tin trường THPT Chuyên Võ Nguyên Giáp Đó lí tơi chọn đề tài: “Bài tốn tìm khung đồ thị vơ hướng” làm đề tài nghiên cứu cho sáng kiến kinh nghiệm 1.2 Điểm đề tài “Bài tốn tìm khung đồ thị vô hướng” chuyên đề quan trọng bồi dưỡng học sinh giỏi Tin học nhà trường chuyên đề lý thuyết đồ thị thuật toán đồ thị Có nhiều dạng đồ thị, nhiều dạng toán thuật toán đồ thị Một toán tối ưu tiếng đồ thị tốn tìm khung, khung cực tiểu Giải pháp đặt sử dụng thuật tốn tìm khung, khung cực tiểu để giải tốn đặc trưng đồng thời áp dụng thuật toán cho lớp toán kiểm tra tính liên thơng đồ thị, đếm số thành phần liên thông đồ thị Khi sử dụng thuật toán để quay trở lại giải tốn nói cho học sinh có định hướng tốt việc phân tích, lựa chọn thuật toán phù hợp, tốt để thiết kế, cài đặt cho toán PHẦN NỘI DUNG 2.1 Thực trạng Trong toán học tin học, lý thuyết đồ thị nghiên cứu tính chất đồ thị Một cách khơng thức, đồ thị tập đối tượng gọi đỉnh (hoặc nút) nối với cạnh (hoặc cung) Cạnh có hướng vơ hướng Đồ thị thường vẽ dạng tập điểm (các đỉnh nối với đoạn thẳng (các cạnh) Những ý tưởng đồ thị đưa từ kỷ thứ XVIII nhà toán học Thụy Sĩ Leonhard Euler, ơng dùng mơ hình đồ thị để giải toán cầu Konigsberg tiếng Mặc dù lý thuyết đồ thị khoa học phát triển từ lâu lại có nhiều ứng dụng đại Đặc biệt khoảng vài mươi năm trở lại đây, với sự phát triển nhanh chóng Cơng nghệ thơng tin, Lý thuyết đồ thị quan tâm nghiên cứu đến nhiều Hiện nay, môn học kiến thức sở mơn khoa học máy tính Đặc biệt thuật tốn đồ thị có nhiều ứng dụng nhiều lĩnh vực khác như: Mạng máy tính, Bưu viễn thơng, Tối ưu hố, Giao thông vận tải, v.v Ở trường THPT Chuyên Võ Nguyên Giáp vấn đề bồi dưỡng học sinh giỏi, bồi dưỡng giáo viên vấn đề quan tâm hàng đầu Đặc biệt lớp khối chuyên Tin yêu cầu học sinh phải nắm vững kiến thức tư thuật tốn mà phải biết sử dụng ngơn ngữ lập trình thành thạo cấu trúc liệu hợp lí để giải toán Tin học Như ta biết: "Thuật toán + Cấu trúc liệu + Ngơn ngữ lập trình = Chương trình" Như vậy, cơng việc khơng phần quan trọng để lập trình giải tốn Tin học việc lựa chọn cấu trúc liệu hợp lí Do học sinh cần phải biết cách khai thác sử dụng cấu trúc liệu cách hợp lí Từ việc xác định cấu trúc liệu cần sử dụng, học sinh hình thành tư thuật tốn, lựa chọn thuật toán tối ưu để giải toán cụ thể 2.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 tập đỉnh, E tập cặp khơng có thứ tự gồm hai phần tử khác V gọi cạnh Định nghĩa đỉnh cạnh đồ thị vô hướng Hai đỉnh u v đồ thị vô hướng G gọi kề (u, v) cạnh đồ thị G Nếu e=(u, v) cạnh đồ thị ta nói cạnh liên thuộc với hai đỉnh u v, nói cạnh e nối đỉnh u đỉnh v, đồng thời đỉnh u v gọi đỉnh đầu cạnh (u, v) • Định nghĩa bậc đỉnh đồ thị vô hướng Ta gọi bậc đỉnh v đồ thị vô hướng số cạnh liên thuộc với ký hiệu deg(v) • • Định nghĩa đường đồ thị vô hướng Đường độ dài n từ đỉnh u đến đỉnh v, n nguyên dương, đồ thị vô hướng G = (V, E) dãy x0, x1, x2, , xn-1, xn đó: u = x0, v = xn, (xi, xi+1) € E, i = 0, 1, 2, n-1 Đường nói biểu diễn dạng dãy cạnh: (x0, x1), (x1, x2), (x2, x3), , (xn-2, xn-1), (xn-1, xn) Đỉnh u gọi đỉnh đầu, đỉnh v gọi đỉnh cuối đường Đường gọi đơn khơng có cạnh bị lặp lại • Định nghĩa chu trình đồ thị vô hướng Đường độ dài n từ đỉnh u đến đỉnh v, n nguyên dương, đồ thị vô hướng G = (V, E) dãy x0, x1, x2, , xn-1, xn đó: u = x0, v = xn, (xi, xi+1) ∈ E , i = 0, 1, 2, n-1 Đỉnh u gọi đỉnh đầu, đỉnh v gọi đỉnh cuối đường Đường có đỉnh đầu trùng với đỉnh cuối (tức u = v) gọi chu trình Chu trình gọi đơn khơng có cạnh bị lặp lại • Định nghĩa liên thông đồ thị vô hướng Đồ thị vô hướng G = (V, E) gọi liên thơng ln tìm đường hai đỉnh đồ thị • Định nghĩa thành phần liên thông đồ thị vô hướng Ta gọi đồ thị dồ thị G = (V, E) đồ thị H = (W, F) đó: W ⊆ V F ⊆ E Trong trường hợp đồ thị khơng liên thơng, rã số đồ thị liên thông đôi đỉnh chung Những đồ thị liên thơng ta gọi thành phần liên thông đồ thị • Định nghĩa Cây đồ thị vô hướng Ta gọi T = (V, E) đồ thị vơ hướng liên thơng khơng có chu trình Đồ thị khơng có chu trình gọi rừng • Định nghĩa khung đồ thị vô hướng Cho G = (V, E) đồ thị vô hướng liên thông Cây T = (V, F) với F ⊂ E gọi khung đồ thị 2.3 Bài tốn tìm khung 2.3.1 Bài tốn thực tế Xây cầu nối đảo BRIDGE.??? Chủ đầu tư xây dựng đặc khu kinh tế quần đảo Quần đảo có n đảo đánh số từ 1, 2, n Trên đảo xây dựng xong sở vật chất hạ tầng phục vụ cho đời sống phát triển kinh tế Tuy nhiên đảo chưa xây dựng cầu để nối chúng nên việc lại đảo vất vả, đặc biệt mua mưa bão Để thu hút nhà đầu tư đưa vốn phát triển đặc khu, Chủ đầu tư định lập dự án xây dựng cầu nối đảo đặc khu nhằm thúc đẩy phát triển kinh tế du lịch Đơn vị thi cơng khảo sát địa hình cho Chủ đầu tư biết địa hình địa chất nơi đảm bảo xây dựng số cầu nối trực tiếp đảo, xây dựng xong đảm bảo người dân đảo đến với cầu xây dựng Do không đủ nguồn vốn để xây dựng tất cầu lúc, Chủ đầu tư định xây dựng số cầu giai đoạn cho đảm bảo người dân đảo đến đảo lại cầu xây dựng Yêu cầu: Hãy giúp Chủ đầu tư lập kế hoạch xây dựng số cầu đảm bảo người dân đảo đến đảo lại Dữ liệu vào: Cho file BRIDGE.INP có cấu trúc: - Dòng 1: Ghi số nguyên dương n, số lượng đảo đặc khu (2 ≤ n ≤ 100) - Dòng thứ i n dòng tiếp theo: Mỗi dòng ghi n số 1, số thứ j = thể xây cầu nối trực tiếp đảo i với đảo j (1 ≤ i, j ≤ n) Dữ liệu ra: Ghi file văn BRIDGE.OUT theo cấu trúc: - Dòng 1: Ghi số nguyên dương k, số cầu cần phải xây dựng - k dòng tiếp theo: Mỗi dòng ghi số p, q thể việc cần xây dựng cầu nối đảo p với đảo q Hai số ghi cách dấu cách Ví dụ: BRIDGE.INP 1 1 1 0 0 0 1 0 1 0 0 0 0 BRIDGE.OUT 1 2 2.3.2 Đưa tốn mơ hình đồ thị Với tốn thực tế trên, ta mơ hình hóa đồ thị vô hướng sau: - Gọi đảo đỉnh đồ thị - Gọi cầu nối trực tiếp hai đảo cạnh đồ thị Từ ví dụ cụ thể cho ta có đồ thị G = (V, E) sau đây: Tập đỉnh: V = {1, 2,3, 4,5, 6} Tập cạnh: E = {(1, 2);(1, 4);(1,5);(1, 6);(2,3); (2, 4);(4,5)} 2.3.3 Thuật toán Việc xây dựng cầu đảm bảo người dân lại đảo với thực chất tìm đồ thị liên thơng Để xây dựng cầu đảm bảo người dân lại đảo xây dựng khung T = (V, F) với F ⊂ E Vậy thuật tốn để giải tốn thuật tốn tìm khung T = (V, F) đồ thị G = (V, E), G đồ thị liên thơng Có nhiều thuật tốn để giải tốn tìm khung, ta chọn thuật tốn duyệt theo chiều sâu (DFS) duyệt theo chiều rộng (BFS) Sau 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 khung T: Procedure Solution Begin T= ∅ While E ≠ ∅ Begin - Lấy cạnh e = ( u , v ) tập cạnh E đồ thị G - Dùng thủ tục BFS(u, v) để tìm đường từ u đến v khung T = (V, F), không tồn đường từ u đến v thì: Nạp cạnh e = ( u, v ) vào khung T (nạp cạnh e vào tập cạnh F khung T) - Loại bỏ cạnh e = ( u , v ) khỏi tập cạnh E đồ thị G End; End; Hàm BFS(u, v) dùng để kiểm tra kết nạp thêm cạnh e = ( u , v ) vào khung T = (V, F) có tạo thành chu trình hay không Function BFS(u,v); Begin BFS := True; Nạp u vào Stack, đánh dấu thăm u; While Stack ≠ ∅ Begin Lấy p từ đỉnh Stack; For q lân cận p Begin Nạp q vào Stack, đánh dấu thăm q; End; If p = v then Begin BFS:= False; Exit; End; End; End; 2.3.4 Chương trình * Cấu trúc liệu: - Dùng hai mảng P, Q: Array[0 100] of Integer danh sách kề chứa cạnh đồ thị G, e = (Q[i], P[i]) cạnh đồ thị - Dùng mảng B: array[1 100, 100] of Integer ma trận kề để chứa cạnh khung T tìm - Dùng mảng Free: array[1 max] of Boolean để đánh dấu đỉnh thăm T để kiểm chu trình muốn nạp thêm cạnh e = (Q[i], P[i]) vào khung T - Dùng mảng Stack: array[1 max] of Integer để sử dụng thuật tốn DFS việc kiểm tra chu trình muốn nạp thêm cạnh e = (Q[i], P[i]) vào khung T * Chương trình: Program Thuat_toan_DFS_tim_cay_khung; Const Max = 1000; fi='BRIDGE.INP'; fo='BRIDGE.OUT'; Type mmci=Array[0 Max] of Integer; Var f:text; P,Q:mmci; B: array[1 Max, Max] of Integer; Free: array[1 Max] of Boolean; Stack: array[1 Max] of Integer; n, S, Last,Sl: Integer; Procedure Init; Begin FillChar(P, SizeOf(P), 0); FillChar(Q, SizeOf(Q), 0); FillChar(B, SizeOf(B),0); Sl:=0; End; Procedure Read_Data; Var i,j,u: Integer; Begin Assign(f,fi);Reset(f); Readln(f,N); For i:=1 to n Begin For j:=1 to n Begin Read(f,u); if (u0) and (i Begin i:=SPop; For j:=1 to N if (B[i,j] > 0) And Free[j] then Begin SPush(j); Free[j]:=False; End; if i = v then Begin DFS:= False; Exit; End; End; End; Procedure Solution; Var u,v,i,Value:Integer; Begin 17 For i:=1 to Sl Begin u:=P[i]; v:=Q[i]; Value:=L[i]; if DFS(u,v) then Begin B[u,v]:=Value; B[v,u]:=Value; End; End; End; Procedure Write_Data; Var i,j,Sum:Integer; g:Text; Begin Assign(g,fo); Rewrite(g); Sum:=0; For i:= to N For j := i+1 to N if B[i,j]>1 then Sum:=Sum+B[i,j]; Writeln(g,Sum); For i:= to N For j := i+1 to N if B[i,j]>1 then Writeln(g,i,' ',j,' ', B[i,j]); Close(g); End; BEGIN Init; Read_Data; Sort; Solution; Write_Data; 18 END * Chương trình sử dụng phương pháp ghép cặp (Union) để kiểm tra việc tạo thành chu trình: Program CAMP_Kruskal_Union; Const max = 1000; fi='CAMP.INP'; fo='CAMP.OUT'; Type mmci=Array[0 max] of Integer; Var f:text; D,P,Q,L:mmci; B: array[1 max, max] of Integer; n, S, Last,Sl: Integer; Procedure Init; Begin FillChar(P, SizeOf(P), 0); FillChar(Q, SizeOf(Q), 0); FillChar(B, SizeOf(B),0); FillChar(D, SizeOf(D),0); Sl:=0; End; Procedure Read_Data; Var i,j,u: Integer; Begin Assign(f,fi);Reset(f); Readln(f,N); For i:=1 to n Begin For j:=1 to n Begin Read(f,u); if (u0) and (i L[j] then Begin Swap(L[i],L[j]); Swap(P[i],P[j]); Swap(Q[i],Q[j]); End; End; Function Find(l:Integer):Integer; Begin While (l D[l]) l:= D[l]; Find:= l; End; Function Union(u,v:Integer):Boolean; 20 Var ntu,ntv:Integer; Begin Union:=False; ntu:=Find(u); ntv:=Find(v); If ntu=ntv then exit; If ntu>ntv then D[ntv]:=ntu Else D[ntu]:=ntv; Union:=True; End; Function Kruskal:Boolean; Var i,slcanh,t:Longint; Begin For i:=1 to N D[i]:=i; slcanh:=0; t:=0; While (slcanh0 then Writeln(g,i,' ',j,' ', B[i,j]); Close(g); End; BEGIN Init; Read_Data; Sort; If Kruskal then Write_Data Else Begin Assign(f,fo); Rewrite(f); Writeln(f,0); Close(f); End; END 22 KẾT LUẬN 3.1 Ý nghĩa, phạm vi áp dụng Qua trình nghiên cứu thực hiện, đề tài hoàn thành đạt kết sau: - Tìm hiểu trình bày tốn tìm khung, khung cực tiểu; - Tìm hiểu trình bày thuật tốn, giải tốn tìm khung, tốn tìm khung cực tiểu; - Trình bày phương pháp tư phân tích tốn, đưa tốn thực tế mơ hình đồ thị để giải quyết; - Viết chương trình để giải tốn thực tế trình bày đề tài Trong đề tài tơi trình bày nhiều thuật tốn tìm khung khung cực tiểu để học sinh lựa chọn, phân tích độ phức tạp thuật tốn Từ hình thành tư duy, kỹ giải vấn đề liên quan đến thuật toán học Đề tài trình bày thuật tốn DFS để tìm khung, khung cực tiểu từ học sinh tiếp cận nghiên cứu sử dụng thuật toán tương tự BFS để giải tốn đặt Qua học sinh ngồi việc nắm bắt khả vận dụng thuật toán để giải lớp toán khác mà lần học sinh củng cố, khắc sâu kiến thức học “Bài tốn tìm khung đồ thị vô hướng” áp dụng 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 cho em học sinh u thích việc lập trình môn Tin học Đề tài sử dụng cho giáo viên dạy Tin học tham khảo, nâng cao khả tư thuật toán khả lập trình thân, từ nâng cao chất lượng dạy học 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 sử dụng để tìm khung cực tiểu mà vận dụng để giải lớp vấn đề liên quan đến kiểm tra tính liên thơng đồ thị, đếm số thành phần liên thông đồ thị Có hai thuật tốn tốt, tối ưu để tìm khung cực tiểu Kruskal Prim Mỗi thuật tốn sử dụng mơ hình tốn học khác Tuy nhiên, đề tài trình bày thuật tốn tối ưu Kruskal thuật tốn Prim hướng để hướng dẫn học sinh tự nghiên cứu, tìm hiểu Khi học sinh tìm hiểu thuật tốn Prim từ em tự gđánh giá điểm mạnh, điểm hạn chế thuật 23 tốn để từ đúc rút kinh nghiệm cho thân việc lựa chọn thiết kế thuật toán Rất mong nhận ý kiến đóng góp q thầy đồng nghiệp để đề tài hoàn thiện Xin chân thành cảm ơn! 24 MỤC LỤC PHẦN MỞ ĐẦU .3 1.1 Lý chọn đề tài 1.2 Điểm đề tài PHẦN NỘI DUNG 2.1 Thực trạng .4 2.2 Một số định nghĩa liên quan đến lý thuyết đồ thị 2.3 Bài tốn tìm khung 2.3.1 Bài toán thực tế 2.3.2 Đưa toán mơ hình đồ thị 2.3.3 Thuật toán 2.3.4 Chương trình 2.4 Bài tốn tìm khung cực tiểu 12 2.4.1 Bài toán thực tế 13 2.4.2 Đưa tốn mơ hình đồ thị 14 2.4.3 Thuật toán 14 2.4.4 Chương trình 15 KẾT LUẬN 23 25 TÀI LIỆU THAM KHẢO [1] Nguyễn Đức Nghĩa – Nguyễn Tô Thành – Toán rời rạc - Nhà xuất Đại học Quốc Gia Hà Nội, 2004 [2] Các tài liệu Internet 26 NhËn xÐt cđa héi ®ång khoa häc 27 ... liên thơng đồ thị vô hướng Đồ thị vô hướng G = (V, E) gọi liên thơng ln tìm đường hai đỉnh đồ thị • Định nghĩa thành phần liên thơng đồ thị vô hướng Ta gọi đồ thị dồ thị G = (V, E) đồ thị H = (W,... thuyết đồ thị thuật tốn đồ thị Có nhiều dạng đồ thị, nhiều dạng toán thuật toán đồ thị Một toán tối ưu tiếng đồ thị tốn tìm khung, khung cực tiểu Giải pháp đặt sử dụng thuật tốn tìm khung, khung. .. F) khung đồ thị G Ta gọi độ dài c(T) khung T tổng độ dài cạnh nó: c(T ) = ∑ c(e) e∈F Bài toán đặt số tất khung đồ thị G tìm khung với dài nhỏ Cây khung gọi khung cực tiểu đồ thị toán đặt tốn tìm