Một số thuật toán xây dựng cây khung(*)

Một phần của tài liệu Giáo trình toán rời rạc 2 (Trang 63 - 66)

Xây dựng cây khung bằng thuật toán tìm kiếm trên ựồ thị:

Sử dụng thuật toán tìm kiếm theo chiều rộng (BFS) hay tìm kiếm theo chiều sâu (DFS), bắt ựầu từ một ựỉnh S của ựồ thị G. Tại mỗi bước từ ựỉnh u ựến thăm ựỉnh v thì ta ghi nhận thêm một cạnh (u,v) vào cây khung.

đồ thị G liên thông, xuất phát từ ựỉnh S duyệt qua tất cả các ựỉnh còn lại, mỗi ựỉnh chỉ ựúng một lần, ghi nhận ựược nỜ1 cạnh. Lúc ựó, ta ựã xây dựng ựược một cây khung của ựồ thị G.

Chương trình minh hoạ xây dựng cây khung bằng thuật toán tìm kiếm theo chiều sâu

Input: số ựỉnh và danh sách cạnh của ựồ thị. Output: liệt kê các cạnh của cây khung.

Chương trình sau bỏ qua việc kiểm tra tắnh liên thông của ựồ thị.

Trong cả hai trường hợp mỗi khi ta ựến ựược ựỉnh mới u (tức Chuaxet[u]=true) từ ựỉnh v thì cạnh (v, u) sẽ ựược kết nạp vào cây khung. Hai thuật toán tương ứng ựược trình bày trong hai thủ tục sau ựây.

Procedure stree_DFS(v);

(* tim kiem theo chieu sau ap dung vao tim tap canh cua cay khung T cua do thi vo huong lien thong G cho boi danh sach ke. Cac bien Chuaxet, Ke, T la toan cuc*)

begin Chuaxet[v]:=false; For u ∈ Ke(v) do If Chuaxet[u] then Begin T:=T ∪ (u,v); STREE_DFS(u);

End; end; (* Main Program *) begin (* Initialition *) for u∈ V do Chuaxet[u]:=true;

T := ∅ ; (* T la tap canh cua cay khung *)

STREE_DFS(root); ( root la dinh nao do cua do thi *)

end.

Procedure Stree_BFS(v);

(* tim kiem theo chieu rong ap dung tim tap canh cua cau khung T cua do thi vo huong lien thong G cho boi danh sach Ke *) begin Queue:=∅; Queue ⇐ r; Chuaxet[r]:=false; While queue <> ∅ do Begin V ⇐ queue; For r ∈ Ke(v) do If Chuaxet[u] then Begin

Queue ⇐ u; Chuaxet[u]:=false; T:= T ∪ (u,v); End; End; end; (* Main Program *); begin for u ∈ V do Chuaxet[u]:=true;

T := ∅ ; (* T la tap canh cua cay khung *)

Stree_BFS(root); (* root la mot dinh tuy y cua do thi *)

end. Chú ý:

1. Lập luận tương tự như trong phần trước có thể chỉ ra ựược rằng các thuật toán mô tả ở trên có ựộ phức tạp tắnh toán O(m+n).

2. Cây khung tìm ựược theo thủ tục Stree_BFS() là cây ựường ựi ngắn nhất từ gốc r ựến tất cả các ựỉnh còn lại của ựồ thị.

Xây dựng cây khung bằng thuật toán hợp nhất các vùng liên thông

Ý tưởng: ựặt T = (V,∅) không chứa cạnh nào. Có thể xem ựồ thị T gồm n thành phân liên thông, mỗi thành phần liên thông chỉ có một ựỉnh. Sau ựó, lần lượt xét các cạnh của G. Nếu cạnh ựang xét nối 2 thành phần liên thông khác nhau trong T thì thêm cạnh ựó vào ựồ thị T (hợp nhất 2 thành phần liên thông ựó thành một thành phần liên thông trong T). Làm như vậy sẽ ựưa nỜ1 cạnh vào ựồ thị T. Lúc ựó, ựồ thị T là cây khung của ựồ thị G.

Thực hiện:

Ớ xem mỗi ựỉnh u thuộc một thành phần liên thông có mã là c[u]=u (mục ựắch mã liên thông ựể biết 2 ựỉnh khác nhau có cùng thuộc một thành phần liên thông không : 2 ựỉnh u và v có c[u] = c[v] thì ựỉnh u và v cùng thuộc một thành phần liên thông. 2 ựỉnh u và v có c[u] <> c[v] thì ựỉnh u và v thuộc 2 thành phần liên thông khác nhau)

Ớ Số cạnh ựược ựưa vào cây khung : sc = 0 Bước 2: Duyệt tất cả các cạnh của ựồ thị:

Ớ nếu sc = n Ờ 1 thì dừng vòng duyệt

Ớ nếu cạnh (u,v) có c[u] <> c[v] (ựỉnh u và v thuộc 2 thành phần liên thông khác nhau, sẽ hợp nhất 2 thành phần liên thông này thành một thành phần liên thông):

nếu c[u] < c[v] thì tất cả các ựỉnh có cùng mã c[v] ựược gán lại mã là c[u].

nếu c[u] > c[v] thì tất cả các ựỉnh có cùng mã c[u] ựược gán lại mã là c[v].

nạp cạnh (u,v) vào cây khung, tăng sc lên 1.

Xây dựng cây khung bằng thuật toán hợp nhất dần các cây:

đặt T=( V,∅ ) không chứa cạnh nào. Có thể xem T gồm n cây, mỗi cây chỉ có một ựỉnh. Sau ựó, lần lượt xét các cạnh của G. Nếu cạnh ựang xét nối 2 cây khác nhau trong T thì thêm cạnh ựó vào ựồ thị T (hợp nhất 2 cây ựó thành một cây trong T). Làm như vậy sẽ ựưa nỜ1 cạnh vào ựồ thị T. Lúc ựó, ựồ thị T là cây khung của ựồ thị G.

Bài 10 Bài toán tìm ựường ựi ngắn nhất

Trong các ứng dụng thực tế, bài toán tìm ựường ựi ngắn nhất giữa 2 ựỉnh của 1 ựồ thị liên thông có ý nghĩa to lớn vắ dụ như trong bài toán chọn 1 hành trình tiết kiệm nhất trên 1 mạng giao thông, bài toán lập lịch thi công các công ựoạn nhỏ trong 1 công trình thi công lớn, bài toán lựa chọn ựường truyền tin với chi phắ nhỏ nhất trong mạng thông tin vvvẦ

Một phần của tài liệu Giáo trình toán rời rạc 2 (Trang 63 - 66)

Tải bản đầy đủ (PDF)

(137 trang)