Skkn chuyên đề dfs và ứng dụng

128 19 0
Skkn chuyên đề dfs và  ứng dụng

Đ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

Mục lục Một số khái niệm đồ thị Đếm số vùng liên thông DFSVLT.* .7 Liệt kê vùng liên thông DFSNVLT.* 13 Tìm vùng liên thơng có nhiều đỉnh DFSMVLT.* .20 Liệt kê đỉnh đến từ đỉnh S DFSLVLT.* 28 Tìm đường từ đỉnh S đến đỉnh T DFSSTVLT.* .35 Xây cầu DFSBRIGE.* 39 Đường từ S DFSTRACE.* 43 Đường từ S qua nhiều đảo DFSLMAX.* 46 Tham quan K đảo DFSLK.* 53 10 Hành trình từ S tới T vài đảo bị phong tỏa DFSSECUR.* 59 11 Các vùng liên thơng có tổng lớn DFSSMAX.* 64 12 Vùng nguyên tố lớn DFSPRIME.* 69 13 Vùng có tổng chi phí nhỏ S DFSTS.* .75 14 Vé miễn phí DFSTK.* .79 15 Xây cầu DFSBRG2.* .84 16 Đường đồ thị có hướng DFSORIEN.* 89 17 Đường từ S tới T ngược lại DFSOST.* 93 18 Tìm điểm hẹn DFSOST2.* 98 19 Đường truyền an toàn DFSSAFE.* 104 20 Điểm đến an toàn DFSSAFE2.* 109 skkn Một số khái niệm đồ thị Một đồ thị kí hiệu G = (V,E) Trong đó:  V tập đỉnh đồ thị Kí hiệu |V| = N số đỉnh đồ thị  E tập cạnh đồ thị Kí hiệu |E| = M số cạnh đồ thị Đỉnh: Đỉnh biểu diễn đối tượng đồ thị, thường đánh dấu số 1, 2,… kí hiệu chữ in thường u,v,… Cạnh: Cạnh nối đỉnh x với đỉnh y tập gồm hai phần tử (x,y) (x,y) thường vẽ dạng đoạn thẳng nối hai đỉnh Cạnh có hướng (cung): Là cặp đỉnh có thứ tự Trong cặp có thứ tự đó, đỉnh thứ gọi đỉnh đầu, đỉnh thứ hai đỉnh cuối Cạnh vô hướng: Không quan tâm đến hướng coi hai đỉnh Khun: Là cạnh nối đỉnh với Hai cạnh song song: Là hai cạnh nối hai đỉnh u, v Đồ thị có hướng: skkn Là đồ thị mà tất cạnh đồ thị có hướng Đồ thị vơ hướng: Là đồ thị mà tất cạnh đồ thị vô hướng Đơn đồ thị: Là đồ thị khơng có khun khơng có cạnh song song Đa đồ thị: Là đồ thị đơn đồ thị Bậc: Trong đồ thị vô hướng, bậc đỉnh v đồ thị G, ký hiệu dG(u), số cạnh liên thuộc với v, đó, khun tính hai lần Ta có định lí: Giả sử G=(V,E) đồ thị vơ hướng, tổng bậc đỉnh V lần số cạnh Hệ quả: Trong đồ thị vô hướng, số đỉnh bậc lẻ chẵn Trong đồ thị có hướng, ta định nghĩa bán bậc u số cung khỏi nó, kí hiệu d+G(u), bán bậc vào u số cung vào đỉnh đó, kí hiệu d-G(u) Giả sử G=(V, E) đồ thị có hướng, tổng bán bậc vào tổng bán bậc số cung đồ thị Đường chu trình: Một dãy đỉnh P = (p0, p1, …, pk) cho (Pi-1, Pi) ∊ E, ∀i: ≤ i ≤ k gọi đường Một đường chu trình p0 = pk Liên thơng: Một đồ thị vô hướng liên thông tồn đường hai cặp đỉnh thuộc đồ thị skkn Một đồ thị có hướng liên thông yếu phiên vô hướng đồ thị liên thơng Biểu diễn đồ thị máy tính Có nhiều cách để biểu diễn đồ thị máy tính, tùy thuộc vào tính chất đồ thị thuật toán áp dụng với đồ thị… Ta lưu kèm theo thơng tin trọng số, giá trị phù hợp với cạnh * Biển diễn đồ thị theo ma trận kề: Tạo ma trận A kích thước n*n n số đỉnh đồ thị Nếu đơn đồ thị, vô hướng không trọng số: a[u][v] = cạnh nối hai đỉnh u, v a[u][v] = a[v][u] = có cạnh nối hai đỉnh u, v Nếu đồ thị đa đồ thị vô hướng không trọng số, tương tự, khác ta gán a[u][v] = số cạnh nối u v Nếu đồ thị vơ hướng có trọng số thay a[u][v] = a[v] [u]=1 thành a[u][v] = a[v][u] = c (với c trọng số cạnh đó) Nếu đồ có hướng, liệu đề nói rõ cạnh từ u đến v gán a[u][v] = không gán chiều ngược lại Định nghĩa gán tùy theo lập trình viên hiểu vơ hướng hay có hướng, đơn đồ thị hay đa đồ thị * Một thuật tốn tìm kiếm đồ thị là: DFS skkn Đếm số vùng liên thông DFSVLT.* Vùng liên thông đồ thị tập hợp đỉnh mà từ đỉnh có đường trực tiếp gián tiếp đến đỉnh khác tập hợp Cho đồ thị vơ hướng có N đỉnh, M cạnh Hãy đếm số lượng vùng liên thông đồ thị Dữ liệu: Vào từ file văn DFSVLT.INP gồm:  Dòng 1: Ghi số nguyên N M (M, N ≤ 3000)  M dòng tiếp theo, dòng ghi số nguyên dương u v thể có đường hai đỉnh u v (u, v ≤ N) Kết quả: Ghi file văn DFSVLT.OUT số lượng vùng liên thông DFSVLT.INP DFSVLT.OUT 12 12 (gồm vùng 25 bên, đỉnh 7, 26 đỉnh 8) 10 34 11 12 Thuật toán: * Ta biểu diễn đồ thị theo ma trận kề: Lưu cạnh vào mảng a có N hàng, N cột với N số đỉnh đồ thị Khi đó, a[u,v] = khơng đường trực tiếp từ u tới v a[u,v] = a[v,u] = có đường trực tiếp từ u tới v skkn * Tư tưởng giải thuật Duyệt theo chiều sâu: Ban đầu đỉnh fre[i] = True Duyệt đến đỉnh thứ i, đánh dấu i đến (fre[i] = False) Ta thực duyệt tất đỉnh j free có đường trực tiếp từ i đến j ta Duyệt ( j ) Tới đỉnh j, ta lặp lại việc duyệt bước Lưu ý: Với đỉnh i, ta đến tất đỉnh có đường trực tiếp gián tiếp tới i Như vậy, lần duyệt (i) xong ta thu vùng liên thông Ở này, ta tăng biến đếm số lượng vùng liên thơng lên Độ phức tạp thuật tốn: O(M + N) ? Code chương trình tham khảo: skkn skkn Code mẫu C++: Code1 skkn Code mẫu C++ code 2: skkn 10 skkn Code tham khảo: 114 skkn 19 Đường truyền an toàn DFSSAFE.* Đồ thị có hướng đồ thị mà tất cạnh đồ thị có hướng Cạnh (u, v) thể có đường từ đỉnh u tới đỉnh v Cho đồ thị có hướng có N đỉnh, M cạnh Jame đỉnh S, muốn truyền tin đến đỉnh T Đường truyền gọi an tồn có hai đường truyền khác từ đỉnh S đến đỉnh T Hai đường truyền gọi khác có đỉnh đường khác Hãy cho biết đường truyền từ S tới T có an tồn hay khơng? Nếu có ghi YES số lượng đường chuyền từ S tới T, ngược lại ghi NO Dữ liệu: Vào từ file văn DFSSAFE.INP gồm:  Dòng 1: Ghi số nguyên dương N, M, S, T (M, N ≤ 3000, S, T ≤ N, S≠T)  M dòng tiếp theo, dòng ghi số nguyên dương u v thể có đường từ đỉnh u đến đỉnh v (u, v ≤ N) Kết quả: Ghi file văn DFSSAFE.OUT đường truyền từ S tới T an tồn ghi YES số lượng đường truyền từ S tới T, ngược lại ghi NO DFSSAFE.INP DFSSAFE.OUT 11 YES 13 12 15 51 26 62 32 115 skkn 24 42 46 45 11 13 12 15 51 26 62 32 24 42 46 45 NO 116 skkn Thuật toán: * Ta biểu diễn đồ thị theo ma trận kề: Lưu cạnh vào mảng a có N hàng, N cột với N số đỉnh đồ thị Khi đó, a[u,v] = khơng đường trực tiếp hướng từ u tới v a[u,v] = có đường trực tiếp hướng từ u tới v Lưu ý: a[v,u] khác a[u,v] * Tư tưởng giải thuật Duyệt theo chiều sâu: Ban đầu đỉnh fre[i] = True Duyệt đến đỉnh thứ i, đánh dấu i đến (fre[i] = False) Ta thực duyệt tất đỉnh j free có đường trực tiếp từ i đến j ta: { Lưu đường tới j i vào mảng vt[j] := i; Nếu j = T tăng biến đếm lên Duyệt ( j ) } Tới đỉnh j, ta lặp lại việc duyệt bước Ở chương trình ta gọi duyet(S); để tìm đường từ S tới T Nếu số lượng đường từ S tới T đếm >= đưa YES đếm, Ngược lại ghi NO Độ phức tạp thuật tốn: O(M + N) ? Code chương trình tham khảo: 117 skkn Code tham khảo: 118 skkn Code tham khảo: 119 skkn 120 skkn 121 skkn 20 Điểm đến an tồn DFSSAFE2.* Đồ thị có hướng đồ thị mà tất cạnh đồ thị có hướng Cạnh (u, v) thể có đường từ đỉnh u tới đỉnh v Cho đồ thị có hướng có N đỉnh, M cạnh Jame đỉnh S, muốn truyền tin đến đỉnh T đồ thị Đường truyền gọi an tồn có hai đường truyền khác từ đỉnh S đến đỉnh T Hai đường truyền gọi khác có đỉnh đường khác Hãy đưa điểm đến an toàn Dữ liệu: Vào từ file văn DFSSAFE2.INP gồm:  Dòng 1: Ghi số nguyên dương N, M, S (M, N ≤ 3000, S ≤ N)  M dòng tiếp theo, dòng ghi số nguyên dương u v thể có đường từ đỉnh u đến đỉnh v (u, v ≤ N) Kết quả: Ghi file văn DFSSAFE2.OUT điểm đến an tồn Mỗi số cách dấu cách Nếu khơng có điểm đến an tồn đưa DFSSAFE2.INP 11 13 12 15 51 26 62 32 24 42 46 45 DFSSAFE2.OUT 256 122 skkn 11 13 12 15 51 26 62 32 24 42 46 45 Thuật toán: * Ta biểu diễn đồ thị theo ma trận kề: Lưu cạnh vào mảng a có N hàng, N cột với N số đỉnh đồ thị Khi đó, a[u,v] = khơng đường trực tiếp hướng từ u tới v a[u,v] = có đường trực tiếp hướng từ u tới v Lưu ý: a[v,u] khác a[u,v] * Tư tưởng giải thuật Duyệt theo chiều sâu: Ban đầu đỉnh fre[i] = True Duyệt đến đỉnh thứ i, đánh dấu i đến (fre[i] = False) Ta thực duyệt tất đỉnh j free có đường trực tiếp từ i đến j ta: { Lưu đường tới j i vào mảng vt[j] := i; Nếu j = T tăng biến đếm lên Duyệt ( j ) } Tới đỉnh j, ta lặp lại việc duyệt bước Ở chương trình ta: Duyệt qua tất đỉnh t, ta thực đếm số đường từ S tới T, đếm≥2 đưa t Nếu khơng có đỉnh t thỏa mãn, ghi Độ phức tạp thuật toán: O(M + N) ? 123 skkn Code tham khảo: 124 skkn 125 skkn Code tham khảo: 126 skkn -Hết - 127 skkn “Mỗi ngày chọn niềm vui, Chọn hoa, chọn nụ cười…”  128 skkn ... N) ? Code chương trình tham khảo: skkn skkn Code mẫu C++: Code1 skkn Code mẫu C++ code 2: skkn 10 skkn Code tham khảo: 11 skkn 12 skkn Liệt kê vùng liên thông DFSNVLT.* Vùng liên thông đồ thị... chương trình tham khảo: 23 skkn Code tham khảo: 24 skkn Code tham khảo: 25 skkn 26 skkn Code tham khảo: 27 skkn Code tham khảo: 28 skkn 29 skkn Liệt kê đỉnh đến từ đỉnh S DFSLVLT.* Cho đồ thị vơ... tham khảo: 14 skkn Do đỉnh cần xếp lại, nên bạn cần code thêm đoạn xếp mảng C trước ghi kết 15 skkn Code tham khảo: 16 skkn Code tham khảo: 17 skkn Code tham khảo: 18 skkn 19 skkn 20 skkn Code tham

Ngày đăng: 09/02/2023, 13:57

Tài liệu cùng người dùng

Tài liệu liên quan