Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 112 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
112
Dung lượng
8,51 MB
Nội dung
Mục lục Một số khái niệm đồ thị Đếm số vùng liên thông DFSVLT.* 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 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: 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ị 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 tố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] = khơng có 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 toán tìm kiếm đồ thị là: DFS Đế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 * 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 toán: O(M + N) ? Code chương trình tham khảo: Code mẫu C++: Code1 Code mẫu C++ code 2: Code tham khảo: 10 98 Code tham khảo: 99 Code tham khảo: 100 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.IN P 11 13 12 15 51 26 62 32 24 42 46 45 11 13 12 15 51 26 62 32 24 42 DFSSAFE.OUT YES NO 101 46 45 102 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: Code tham khảo: 103 104 Code tham khảo: 105 106 20 Điểm đến an toà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 toàn Mỗi số cách dấu cách Nếu khơng có điểm đến an tồn đưa DFSSAFE2.IN P 11 13 12 15 51 26 62 32 24 42 46 45 11 13 12 15 51 26 62 32 24 42 46 45 DFSSAFE2.OUT 256 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 đó, 107 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) ? 108 Code tham khảo: 109 Code tham khảo: 110 -Hết - 111 “Mỗi ngày chọn niềm vui, Chọn hoa, chọn nụ cười…” 112 ... file văn DFSLMAX.OUT số đảo nhiều mà Jame tham quan đường DFSLMAX.IN P 12 12 25 26 10 34 11 12 DFSLMAX.OU T (gồm đảo 10 2) Thuật toán: * Ta biểu diễn đồ thị theo ma trận kề: Lưu cạnh vào mảng... 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... 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