I 1 CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập Tự do Hạnh phúc TÊN ĐỀ TÀI BÀI TOÁN TÌM CÂY KHUNG TRÊN ĐỒ THỊ VÔ HƯỚNG Đồng Hới, tháng 01 năm 2019 skkn 2 CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập Tự d[.]
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 skkn 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ênVõ Nguyên Giáp Đồng Hới, tháng 01 năm 2019 skkn 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 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 toá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 skkn 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 tính chất của đồ thị Một cách khơng thức, đồ thị tập đối tượng gọi các đỉnh (hoặc nút) nối với các 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à cịn 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 tố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ể skkn 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 ngun 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 cịn 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 ngun dương, đồ thị vơ hướng G = (V, E) dãy x0, x1, x2, , xn-1, xn đó: u = x0, v = xn, (xi, xi+1) , i = 0, 1, 2, n-1 skkn Đỉ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) đó: Trong trường hợp đồ thị khơng liên thơng, rã số đồ thị liên thơng đơi khơng có đỉ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 gọi khung đồ thị 2.3 Bài tốn tìm khung 2.3.1 Bài toá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 cịn 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 cịn lại skkn Dữ liệu vào: Cho file BRIDGE.INP có cấu trúc: - Dịng 1: Ghi số ngun 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: Tập cạnh: 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 skkn đảm bảo người dân lại đảo xây dựng khung T = (V, F) với Vậy thuật toá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 toá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 Begin - Lấy cạnh 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 vào khung T (nạp cạnh e vào tập cạnh F khung T) - Loại bỏ cạnh 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 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 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; skkn 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 toá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); skkn 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 skkn 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 skkn 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 skkn ... liên thông đồ thị vô hướng Đồ thị vô hướng G = (V, E) gọi liên thông 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ó: Bài tố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ị tốn đặt tốn tìm khung cực tiểu 12 skkn