Giới thiệu thuật toán Prim

Một phần của tài liệu Mô phỏng một số thuật toán trên đồ thị (Trang 27)

6. Ba bài toán trên mô hình đồ thị được đưa vào giảng dạy trong trường Trung

6.4.2.Giới thiệu thuật toán Prim

Một trong hai thuật toán quan trọng để giải bài toán tìm cây khung nhỏ nhất là thuật toán Prim. Thuật toán đó có thể phát biểu hình thức như sau:

Đơn đồ thị vô hướng G = (V, E,w). Xét cây T trong G và một đỉnh v, gọi khoảng cách từ v tới T là trọng số nhỏ nhất trong số các cạnh nối v với một đỉnh nào đó trong T:

d[v] = min{w[u, v]  uT}

Ban đầu khởi tạo cây T chỉ gồm có mỗi đỉnh {1}. Sau đó cứ chọn trong số các đỉnh ngoài T ra một đỉnh gần T nhất, kết nạp đỉnh đó vào T đồng thời kết nạp luôn cả cạnh tạo ra khoảng cách gần nhất đó. Cứ làm như vậy cho tới khi:

Hoặc đã kết nạp được tất cả n đỉnh thì ta có T là cây khung nhỏ nhất

Hoặc chưa kết nạp được hết n đỉnh nhưng mọi đỉnh ngoài T đều có khoảng cách tới T là +. Khi đó đồ thị đã cho không liên thông, ta thông báo việc tìm cây khung thất bại.

Về mặt kỹ thuật cài đặt, ta có thể làm như sau:

Sử dụng mảng đánh dấu Free. Free[v] = TRUE nếu như đỉnh v chưa bị kết nạp vào T.

Gọi d[v] là khoảng cách từ v tới T. Ban đầu khởi tạo d[1] = 0 còn d[2] = d[3] = ... = d[n] = +. Tại mỗi bước chọn đỉnh đưa vào T, ta sẽ chọn đỉnh u nào ngoài T và có d[u] nhỏ nhất. Khi kết nạp u vào T rồi thì rõ ràng các nhãn d[v] sẽ thay đổi: d[v]mới := min(d[v]cũ, v[u, v]). Vấn đề chỉ có vậy (chương trình rất giống thuật toán Dijkstra, chỉ khác ở công thức tối ưu nhãn).

Có thể mô tả thuật toán Prim bằng đoạn giả mã sau:

Bước 1: Khởi tạo: T = {s} d[s] = 0, u = s (s - đỉnh xuất phát) d[v]=+∞(v ∉ T) Bước 2: Lặp N-1 lần (N số đỉnh của đồ thị): 2.1 Cập nhật các đỉnh kề với u ở ngoài T Nếu d[v] > w[u,v] trace[v] = u, d[v] = w[u,v] 2.2 Chọn v (v ∉ T) mà d[v] nhỏ nhất Nếu d[v] = +∞ đến bước 3 2.3 Kết nạp v vào T, u = v

Bước 3: In ra cây khung hoặc thông báo vô nghiệm.

Một phần của tài liệu Mô phỏng một số thuật toán trên đồ thị (Trang 27)