Tải bản đầy đủ (.pptx) (25 trang)

BÀI TOÁN CÂY KHUNG NHỎ NHẤT

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1015.76 KB, 25 trang )

ĐỀ TÀI NHÓM 7
BÀI TOÁN CÂY KHUNG NHỎ NHẤT
Danh sách nhóm: -Hà Xuân Tùng
-Lê Thị Quỳnh Nga
-Vi Đình Diệm
-Hà Thị Thu Trang


GIỚI THIỆU VỀ CÂY VÀ CÂY KHUNG
1. CÂY VÀ CÁC TÍNH CHẤT CƠ BẢN
1.1 Định nghĩa
1.2 Các tính chất cơ bản
2. CÂY KHUNG CỦA ĐỒ THỊ
2.1 Định nghĩa
2.2 Bài toán tìm cây khung ngắn nhất
2.3 Thuật toán Kruskal
2.4 Thuật toán Prim


1. Cây và các tính chất cơ bản
- Cây là một dạng của đồ thị được nhà toán học Anh, Arthur Cayley,
phát biểu và sử dụng từ năm 1857 cho việc xác định những cấu trúc
hợp chất hóa học.

isobutan

Arthur Cayley
(1821-1895)


1. Cây và các tính chất cơ bản


Định nghĩa Cây:
Cho G=(V,E) là đồ thị vô hướng. G được gọi là một Cây (tree)
nếu và nếu G liên thông và không có chu trình đơn.


1. Cây và các tính chất cơ bản
Ví dụ:
a

b

c

d

e

f
G1

a

b

c

d
f

e

G2

a

b

c

d
f

e
G3

G1, G2 là cây; G3, G4 không phải là cây

a

b

c

d
f

e
G4


1. Cây và các tính chất cơ bản

* Các tính chất cơ bản:
- Với cây T có n đỉnh, các phát biểu dưới đây là tương
đương:
1- T liên thông và có n-1 cạnh.
2- T không có chu trình đơn và có n-1 cạnh .
3- Giữa hai đỉnh bất kỳ có đúng một đường đi đơn.
4- T liên thông và mỗi cạnh là một cầu.


2. Cây khung đồ thị
Cách tạo cây khung của đồ thị:
- Thực hiện loại bỏ một cạnh nằm trên một chu trình nào
đóĐịnh
sẽ tạo
ra đồCho
thị G'
cóthị
tínhvôliên
thông.
nghĩa:
G vẫn
là đồ
hướng
liên thông. Ta gọi đồ thị
con T -của
G làhiện
một tiếp
cây khung
nếu bỏ
T thỏa

điềuchu
kiện:trình
Thực
việc loại
các mãn
cạnhhai
ở các
khác cho-Tđến
khi cây;
đồ thị T không còn chu trình nhưng vẫn liên
là một
thông.
- Tập đỉnh của T bằng tập đỉnh của
=> Chúng ta thu được một cây nối tất cả các đỉnh của G - gọi là
cây khung của đồ thị.


2. Cây khung đồ thị
Ví dụ: Cho đồ thị G trong hình dưới đây, hãy thực hiện tìm các
cây khung của đồ thị G.
B
B

A

D
D

A
C

C

F

E
E

F
G
G
H
H


Bài toán tìm cây khung nhỏ nhất:
Cho G=(V,E) là đồ thị vô hướng, liên thông có trọng số.
Giả sử H=(V,T) là một cây khung của đồ thị G.
Độ dài c(H) của cây khung H là tổng trọng số các cạnh của cây:

Bài toán:
Trong số tất cả các cây khung của đồ thị G, hãy tìm ra cây khung
có độ dài nhỏ nhất


Các bài toán thực tế:
1- Bài toán nối mạng máy tính:
2toánmáy
xây dựng
hệ thống
đường

VớiBài
mạng
tính gồm
n máy.
Biết sắt:
chi phí nối máy i với
Chúng
muốn(chi
xây phí
dựng
một
hệ thống
đường
sắt nối cần
n sử
máy j làtam(i,j)
phụ
thuộc
vào độ
dài cáp
thành
hành
khách
một sao
thành
có chi
thể đi
bất
dụng).phố
Hãyđểtìm

cách
nối từ
mạng
chophố
tổng
phíđến
là nhỏ
kỳ
các thành phố còn lại. Yêu cầu thiết kế để chi phí xây
nhất.
dựng hệ thống đường đi là nhỏ nhất.


1. Thuật toán Kruskal (năm 1956)
- Đồ thị G=(V,E), liên thông, có trọng số
- Cây khung H=(V,T), với T  E
Thuật toán Kruscal tìm cây khung ngắn nhất
B0: T = ø;
B1: Sắp xếp các cạnh của G theo thứ tự tăng dần của trọng số.
B2: Xuất phát từ tập cạnh T = ø;
Lần lượt duyệt trong danh sách các cạnh đã được sắp xếp từ nhỏ đến lớn
để tìm ra cạnh bổ sung nó vào T mà không tạo thành chu trình.
Until |T|=n-1 thì kết thúc


Giả mã thuật toán Kruskal
  
Void
Kruskal ( void )
{

T= ø;
While( |T| < (n-1) && (E ≠ ø))
{
E=E\ {e};
if ( T : không tạo nên chu trình )
T=T
}

if (|T| < n-1)
Đồ thị không liên thông;
}


2.4 Thuật toán Kruskal
Ví dụ:
Tìm cây khung ngắn nhất
của đồ thị G trong hình bên.
Giải:

Đặt tập là T=ø (T-là tập cạnh của cây khung ngắn nhất)
Sắp xếp các cạnh của đồ thị G theo trọng số tăng dần:
{(v3, v5), (v4, v6), (v4, v5), (v5, v6), (v3, v4), (v1, v3),
(v2, v3), (v2, v4), (v1, v2)}.


Thêm vào cạnh (v3, v5) vào T; |T|=1
Xét lực lượng của T, |T|<5, nên tiếp tục quá trình xét nạp:
- nạp cạnh (v4, v6) vào T; |T|=2
- nạp cạnh (v4, v5) vào T; |T|=3
- không nạp cạnh (v5, v6) vào T vì tạo chu trình.

- không nạp cạnh (v3, v4) vào T vì tạo chu trình.
- nạp cạnh (v1, v3) vào T; |T|=4
- nạp cạnh (v2, v3) vào T; |T|=5
Kết thúc vì |T|=5


Thuật toán Kruskal
Ví dụ:
Tìm cây khung ngắn nhất của đồ thị G trong hình
dưới.


Thuật toán Prim (năm 1957)
-Dùng để tìm cây bao trùm nhỏ nhất của đồ thị vô hướng có
trọng số liên thông.
-Được tìm ra bởi Vojtěch Jarník (Cộng hòa Séc) vào năm 1930,
sau đó được phát triển bởi Robert.C.Prim vào năm 1957.
-Còn được gọi là thuật toán DJP, thuật toán Jarník, hay thuật
toán Prim–Jarník.


Ý tưởng thuật toán:


Bắt đầu tại một đỉnh tùy ý s của đồ thị, nối s với đỉnh y sao cho trọng số cạnh
c[s,y] là nhỏ nhất.



Tiếp theo, từ đỉnh s hoặc y tìm cạnh có độ dài nhỏ nhất, tìm được đỉnh thứ ba z

và thu được bộ phận gồm 3 đỉnh và 2 cạnh.



Quá trình tiếp tục cho đến khi ta nhận được cây gồm n-1 đỉnh, đó là cây khung
nhỏ nhất cần tìm.


Giải mã thuật toán Prim
void Prim()
{

Chọn s là một đỉnh nào đó của đồ thị;
VH = [s]; T = 0; D[s] = 0; near[s] = s;
for (v thuộc V\VH )
{

d[v] = c[s,v];

Near[v] = s;
}
Stop = false;


while (not stop)
{ tìm u thuộc V\VH thỏa mãn: d[u] = min {d[v]: u thuộc V\VH};
VH = VH hợp [u];
T = T hợp {(u, near[u])};
if (|VH| = n)
{ H = (VH, T) là cây khung nhỏ nhất của đồ thị;

Stop = true;}
else
for (v thuộc V\VH )
if (d[v] > c[u, v] )
{ d[v] = c[u,v];
Near[v] = u;}
}
}


Ví dụ 1:
Tìm cây khung ngắn nhất của đồ thị G trong hình dưới.
9
7

9

A

B

8

5

2
5

7


2

C

4

4

8

D


Lời giải:


Chọn A làm đỉnh xuất phát. Xét có [A,B] = 9,[A,D]= 5,[A,C] = 2;



Chọn đỉnh C (nạp [A,C] = 2 )



Từ C và A làm đỉnh xét tiếp theo.



Xét [C,B] = 7 , [C,D] = 4 , và [A,B] = 9, [A,D] = 5 => Chọn đỉnh D (nạp
[C,D] = 4 )




Lấy D,C,A là đỉnh xét tiếp theo.



Xét [D,B] = 8 ,[C,B] = 7, [A,B] = 9 => chọn đỉnh B (nạp [C,B] = 5).



Số cạnh lúc này là 3 = 4-1. Kết thúc thuật toán.


Ví dụ 2:
Tìm cây khung ngắn nhất của đồ thị G trong hình dưới.


Lời giải:
8

a

b

9

c

d

4

7
6
f

e


Lấy đỉnh a làm đỉnh xuất phát.


Nhận xét:
- Thuật toán Kruskal không đạt hiệu quả cao trong việc tìm cây
khung ngắn nhất cho đồ thị vì số bước thực hiện được tính theo
số cạnh của đồ thị.
- Thuật toán Prim được đánh giá có hiệu quả hơn với những đồ
thị có số cạnh m > n(n-1)/2.


×