KHOA CÔNG NGHỆ THÔNG TIN
Môn: Thuật toán
Nhóm: 1
GVHD: Nguyễn Thanh Cẩm
SVTH: Trịnh Lâm Vũ
Thuật toán PRIM
Giới thiệu
Trong khoa học máy tính, thuật toán Prim là một thuật toán
tham lam để tìm cây bao trùm nhỏ nhất của một đồ thị vô
hướng có trọng số liên thông. Nghĩa là nó tìm một tập hợp
các cạnh của đồ thị tạo thành một cây chứa tất cả các đỉnh,
sao cho tổng trọng số các cạnh của cây là nhỏ nhất.
Thuật toán PRIM
Mô tả
Mô tả: Thuật toán xuất phát từ một cây chỉ chứa đúng một
đỉnh và mở rộng từng bước một, mỗi bước thêm một cạnh
mới vào cây, cho tới khi bao trùm được tất cả các đỉnh của
đồ thị. Còn được gọi là thuật toán lân cận gần nhất. Thuật
toán đúng chỉ dừng lại khi n đỉnh thu được bằng n đỉnh
nhập vào và n-1 cạnh.
Thuật toán PRIM
Chi tiết thuật toán
Các bước:
-
Đầu vào: Một đồ thị có tập hợp đỉnh V và cạnh E
-
Khởi tạo: V(mới) = x, x là một cạnh bất kỳ, E(mới) = {}
-
Lặp lại cho tới khi V(mới) = V
+ Chọn cạnh (u,v) có độ dài nhỏ nhất thỏa mãn u
thuộc V(mới) và v không thuộc V(mới).
+ Thêm v vào V(mới) và thêm cạnh (u,v) vào E(mới).
-
Xuất ra V(mới) và E(mới) .
Thuật toán PRIM
Ví dụ minh họa
Bước 1: Nhập vào đồ thị gồm V và E
-
Tập hợp đỉnh V = {A,B,C,D,E,F} – 6 Đỉnh
-
Tập hợp cạnh E = {(A,B:5)(B,C:8)(C,D:15)(D,E:10)(E,A:9)
(A,F:4)(B,F:7)(C,F:12)(D.F:7)(E,F:3)} – 10 Cạnh
* Chú thích
O : Cạnh đang đượct xét
O : Cạnh và đỉnh đã được chọn
Thuật toán PRIM
Ví dụ minh họa
Bước 2: Khởi tạo V(mới) chứa {B} và E(mới) { }
(Lựa chọn đỉnh B là đỉnh ngẫu nhiên trong đồ thị đưa vào V(mới))
Bước 3: Lựa chọn cạnh (u,v) nhỏ nhất
Có các cạnh (B,A), (B,C) và (B,F)
Chọn cạnh (B,A) vì có độ dài nhỏ nhất
Thêm A vào V(mới) và (B,A) vào E(mới)
Tiếp tục xét các cạnh (u,v) mới
Với điều kiện u thuộc V(mới) và v k thuộc
V(mới)
Lúc này V(mới) = {B,A} , E(mới) = {(B,A:5)}
Thuật toán PRIM
Ví dụ minh họa
Bước 3: Tiếp tục xét ta có:
(B,C),(A,F),(A,E),(B,F) trong đó (A,F) là cạnh có độ dài ngắn nhất
Thêm F vào V(mới) và (A,F) vào E(mới)
Lúc này V(mới) = {B,A,F}, E(mới) = {(B,A:5)(A,F:4)}
Thuật toán PRIM
Ví dụ minh họa
Bước 3: Tiếp tục xét ta có:
(B,C),(F,C),(F,D),(F,E),(A,E) trong đó ta thấy cạnh (F,E) có độ dài ngắn
nhất, lựa chọn F,E.
Thêm E vào V(mới) và (F,E) vào E(mới)
Lúc này V(mới) = {B,A,F,E}
E(mới) = {(B,A:5)(A,F:4)(F,E:3)}
Thuật toán PRIM
Ví dụ minh họa
Bước 3: Tiếp tục xét ta có:
(B,C),(F,C),(F,D),(E,D) trong đó ta thấy cạnh (F,D) có độ dài ngắn nhất,
lựa chọn F,D.
Thêm D vào V(mới) và (F,D) vào E(mới)
Lúc này V(mới) = {B,A,F,E,D}
E(mới) = {(B,A:5)(A,F:4)(F,E:3)(F,D:7)
}
Thuật toán PRIM
Ví dụ minh họa
Bước 3: Tiếp tục xét ta có:
(B,C),(F,C),(D,C) trong đó ta thấy cạnh (B,C) có độ dài ngắn nhất, lựa
chọn B,C.
Thêm C vào V(mới) và (B,C) vào E(mới)
Lúc này V(mới) = {B,A,F,E,D,C}
E(mới) = {(B,A:5)(A,F:4)(F,E:3)(F,D:7)
(B,C:8)}
V(mới) = V(ban đầu) : 6 đỉnh
Ngừng lặp thuật toán
Thuật toán PRIM
Ví dụ minh họa
Bước 4: Xuất kết quả
V(mới) = {B,A,F,E,D,C} – 6 đỉnh
E(mới) = {(B,A:5)(A,F:4)(F,E:3)(F,D:7)(B,C:8)} – 5 cạnh
Độ dài của cây khung nhỏ nhất: 5+4+3+7+8 = 27