Tải bản đầy đủ (.pdf) (23 trang)

slike bài giảng cấu trúc dữ liệu và giải thuật - đỗ bích diệp chương 8c cấu trúc và đồ thị phần 2

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 (1.78 MB, 23 trang )

Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBKHN 1
Cấutrúcdữ liệuvàGiảithuật
Chương V: Đồ thị (phần2)
Cây và Rừng trong lý thuyết đồ thị
– Cây
z Một đồ thị vô hướng liên
thông
z Không có chu trình
– Rừng
z Mộttậpcáccâyphân
biệt
Cây
Rừng
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBKHN 2
Cây khung
– Cho một đồ thị vô hướng, liên thông G
z Cây khung trên G là cây có chứatấtcả các đỉnh trong G
1
2
3
6
5
4
1
2
3
6
5
4


1
2
3
6
5
4
Đồ thị
Cây khung
Cây khung
Bài toán tìm cây khung cựctiểu
z Cho một đồ thị vô hướng, liên thông có trọng số
z Giá trị củamột cây khung là tổng trọng số củacáccung
trong cây
z Tìm một cây khung vớigiátrị nhỏ nhấttrênđồ thị
5
10
6
2
4
8
9
5
6
2
4
Đồ thịđầuvào
Cây khung cựctiểu
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBKHN 3
Giảithuật Kruskal - MST

z Ý tưởng
– Lầnlượt thêm vào cây khung cần tìm các cung có
trọng số nhỏ nhấtcóđượctạimộtthời điểmnếu
cung đó không tạothànhchutrìnhtrênphầncây
khung đang tạmcó
Giảithuật Kruskal-MST
1
2
3
6
5
4
7
7
14
3
7
10
8
12
10
16
Đồ thị ban đầu
1
2
3
6
5
4
7

Bước1
1
2
3
6
5
4
7
3
Bước2
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBKHN 4
Giảithuật Kruskal – MST
1
2
3
6
5
4
7
3
7
1
2
3
6
5
4
7
3

7
7
Bước4Bước3
1
2
3
6
5
4
7
7
14
3
7
10
8
12
10
16
Đồ thị ban đầu
Giảithuật Kruskal - MST
1
2
3
6
5
4
7
3
7

7
8
10
Bước6
1
2
3
6
5
4
7
3
7
7
8
Bước5
1
2
3
6
5
4
7
7
14
3
7
10
8
12

10
16
Đồ thị ban đầu
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBKHN 5
Giảithuật Kruskal - MST
1
2
3
6
5
4
7
3
7
7
8
10
10
Bước7-
Cây khung cựctiểu
1
2
3
6
5
4
7
7
14

3
7
10
8
12
10
16
Đồ thị ban đầu
Giảithuật Kruskal-MST
Algorithm KRUSKAL(G) {đồ thị G có n đỉnh}
1. {Khởi tạo các cụm ban đầu, mỗi cụm chứa 1 đỉnh của đồ thị }
for each vertex v in G do C(v) ← {v}.
2. Khởi tạo một Queue Q chứa các cung trong G, sắp xếp theo chiều tăng dần của trọng
số.
3. {Khởi tạo cây khung ban đầu rỗng} T ←∅
4. {Lần lượt xét các cung đưa vào trong cây khung cần tìm}
while T chứa ít hơn n-1 cung do begin
Lấy ra từ Q cung (u,v) có trọng số nhỏ nhất
C(v) là cụm chứa v, C(u) là cụm chứa u.
if C(v) ≠ C(u) then begin
T = T U {(u,v)}
Nhập C(u) với C(v)
end
end
return T
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBKHN 6
GiảithuậtPrim -MST
z Ý tưởng
z Xây dựng một cây khung bắt đầutừ một đỉnh xuấtphát

z Thời điểm ban đầu, đỉnh xuấtphátlàđỉnh duy nhất
trong mộtcụmC
z Từng bướcthêmvàocụmC một đỉnh w đang ở ngoài C
mà w có nốivới1 đỉnh u trong C thông qua mộtcung
(u,w) có giá trị nhỏ nhấttạithời điểm đó.
GiảithuậtPrim -MST
1
2
3
6
5
4
7
7
14
3
7
10
8
12
10
16
Đỉnh xuấtphátđượcchọn
Là đỉnh số 2
1
2
3
6
5
4

7
7
14
3
7
10
8
12
10
16
Bước1: Từ 2 có cung (2, 4) , (2,6)
đềucótrọng số 10.
Chọn (2,4) cho thêm vào cây khung
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBKHN 7
GiảithuậtPrim -MST
10
1
2
3
6
5
4
7
7
14
3
7
8
12

10
1
2
3
6
5
4
7
7
14
3
7
10
8
12
10
16
Bước2:
Từ 2, 4 có các cung (2,6) , (4,7), (4,3)
Chọn (2,6) có đưa vào cây khung
Bước3: Chọn (6,1)
GiảithuậtPrim -MST
1
2
3
6
5
4
7
7

14
3
7
10
8
12
10
16
1
2
3
6
5
4
7
7
14
3
7
10
8
12
10
Bước4: Chọn (1, 3)
Bước5: Chọn (1, 7)
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBKHN 8
GiảithuậtPrim -MST
1
2

3
6
5
4
7
7
14
3
7
10
8
12
10
Bước6: Chọn (7,5). Tấtcả các đỉnh trong đồ thịđều đã
có trong cây khung
GiảithuậtPrim -MST
Algorithm PRIM_MST(G, v)
1. {Khởi tạo cây khung ban đầu , chứa đỉnh v} T ← {v}
2. Q = V – {v} ; {Q là tập các đỉnh chưa ở trong cây khung}
3. { Thiết lập một mảng d chứa các giá trị trọng số của các cung để tiến hành chọn cung
có giá trị nhỏ nhất nối một đỉnh trong cây với một đỉnh ngoài cây tại từng bước}
d[v] = 0;
for all w ∈ Q do begin
if (tồn tại cung (v,w) ) then d[w] = weight(v,w); else d[w] = ∞;
end
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBKHN 9
GiảithuậtPrim -MST
4. {Lần lượt lựa chọn đỉnh đưa vào trong cây khung}
While ( Q ≠ rỗng) do begin

4.1 Xác định đỉnh u trong Q mà d[u] = min{d[w] | w ∈ Q} ;
4.2 Xác định cung (r,u) với r trong T và weight(r,u) = d[u];
4.3 T ← {(r,u)} ; Q = Q – {u};
{cập nhật lại các giá trị được lưu trong mảng d sau khi đã thêm u vào trong cây
khung, mảng d mới sẽ tiếp tục sử dụng trong bước lựa chọn tiếp theo}
4.4 for all w ∈ Q do d[w] = min (d[w], weight(u,w) );
End;
Bài toán tìm đường đingắnnhất
– Tìm đường đingắnnhấtgiữa1 cặp đỉnh (i,j)
– Tìm đường đingắnnhấttừ 1 đỉnh nguồntớitất
cả các đỉnh còn lại
– Tìm đường đingắnnhấtgiữamọicặp đỉnh
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBKHN 10
Giảithuật Dijkstra
– Đặctrưng
z Giảiquyết bài toán tìm đường đingắnnhấtgiữa1 cặp
đỉnh và bài toán tìm đường đingắnnhấttừ mộtnguồn
tớimọi đích
z Chỉ áp dụng trên đồ thị có trọng số dương
– Ý tưởng:
z Vớimỗi đỉnh v sẽ duytrìcácthôngsố sau
– D[v] : Khoảng cách ngắnnhấtbiết đượctạithời điểmhiện
tạitừđỉnh nguồns tới đỉnh v.
– P[v] : Đỉnh trướccủa đỉnh v trên đường đitừđỉnh nguồns
tớiv
Giảithuật Dijkstra
– Thựchiện
z Duy trì mộtcụmC chứacácđỉnh, cụmnàylúcđầuchứa
đỉnh xuấtphátđã cho. Dầndầnthêmcácđỉnh vào trong

cụm
z Tạimỗibướccủagiáithuật
– xác định đỉnh u chưa ở trong C có giá trị d[u] nhỏ nhất
đưa vào trong C.
– Cậpnhậtlạigiátrị d củacácđỉnh lân cậncủau.
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBKHN 11
Giảithuật Dijkstra
z Tìm đường đingắnnhấttừđỉnh 1 đếncácđỉnh khác
1
3
8
2
6
7
4
5
24
18
2
9
14
15
5
30
20
44
16
11
6

19
6
Giảithuật Dijkstra
1
3
8
2
6
7
4
5
24
18
2
9
14
15
5
30
20
44
16
11
6
19
6
0








Khởitạocácgiátrị d cho tấtcả các đỉnh
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBKHN 12
Giảithuật Dijkstra
1
3
8
2
6
7
4
5
24
18
2
9
14
15
5
30
20
44
16
11
6
19

6
0







KhởitạoC
Giảithuật Dijkstra
1
3
8
2
6
7
4
5
24
18
2
9
14
15
5
30
20
44
16

11
6
19
6
0
14
15




9
Cậpnhật các giá trị d[2] = 9, d[6] = 14, d[7] = 15
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBKHN 13
Giảithuật Dijkstra
1
3
8
2
6
7
4
5
24
18
2
9
14
15

5
30
20
44
16
11
6
19
6
0
14
15
33



9
Mở rộng cụmC, đường đingắnnhấttừ 1 đến2 cóđộ dài 9
Cậpnhậtgiátrị d củacácđỉnh lân cậncủa2
Giảithuật Dijkstra
1
3
8
2
6
7
4
5
24
18

2
9
14
15
5
30
20
44
16
11
6
19
6
0
14
15
32
44


9
Mở rộng cụmC, đường đingắnnhấttừ 1 đến6 cóđộ dài 14
Cậpnhậtgiátrị d củacácđỉnh lân cậnvới6
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBKHN 14
Giảithuật Dijkstra
1
3
8
2

6
7
4
5
24
18
2
9
14
15
5
30
20
44
16
11
6
19
6
0
14
15
32
35

59
9
Mở rộng cụmC, đường đingắnnhấttừ 1 đến7 cóđộ dài 15
Cậpnhậtgiátrị d củacácđỉnh lân cậnvới7
Giảithuật Dijkstra

1
3
8
2
6
7
4
5
24
18
2
9
14
15
5
30
20
44
16
11
6
19
6
0
14
15
32
34

51

9
Mở rộng cụmC, đường đingắnnhấttừ 1 đến3 cóđộ dài 32, điqua 6
Cậpnhậtgiátrị d củacácđỉnh lân cậnvới3
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBKHN 15
Giảithuật Dijkstra
1
3
8
2
6
7
4
5
24
18
2
9
14
15
5
30
20
44
16
11
6
19
6
0

14
15
32
34
45
50
9
Mở rộng cụmC, đường đingắnnhấttừ 1 đến5 cóđộ dài 34, điqua 6,3
Cậpnhậtgiátrị d củacácđỉnh lân cậnvới5
Giảithuật Dijkstra
1
3
8
2
6
7
4
5
24
18
2
9
14
15
5
30
20
44
16
11

6
19
6
0
14
15
32
34
45
50
9
Mở rộng cụmC, đường đingắnnhấttừ 1 đến4 cóđộ dài 45, đi qua 6,3,5
Cậpnhậtgiátrị d củacácđỉnh lân cậnvới4
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBKHN 16
Giảithuật Dijkstra
1
3
8
2
6
7
4
5
24
18
2
9
14
15

5
30
20
44
16
11
6
19
6
0
14
15
32
34
45
50
9
Mở rộng cụmC, đường đingắnnhấttừ 1 đến8 cóđộ dài 50, đi qua 1,6,3,5
Giảithuật Dijkstra
1
3
8
2
6
7
4
5
24
18
2

9
14
15
5
30
20
44
16
11
6
19
6
0
14
15
32
34
45
50
9
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBKHN 17
Giảithuật Dijkstra
Algorithm Dijkstra(G, s)
{Sử dụng hai mảng trung gian D và P gồmn phầntử. Vớin làsốđỉnh trong đồ thị.
D[i] chứakhoảng cách từđỉnh s đến đỉnh i, P[i] chứa đỉnh ngay trước i trong đường
đingắnnhấttừ s đếni tạimộtthời điểm. Kếtthúcgiảithuật, thông tin vềđường đi
ngắnnhấttừđỉnh s đếncácđỉnh khác nằm trong P, độ dài các đường đinằm trong D}
1. {KhởitạoD vàP} for each đỉnh v trong G do begin D[v] = ∞
; P[v] = Null; end.

2. D[s] = 0; Q = V ;
3. While (Q ≠ rỗng) do begin
1. Xác định đỉnh u trong Q mà D[u] có giá trị nhỏ nhất ; Q= Q – {u};
2. Vớilầnlượtcácđỉnh w là lân cậncủau màw cònnằmtrongQ
1. temp= D[u] + weight(u,w) ;
2. If (temp < D[w] ) then begin D[w] = temp; P[w] = u; end;
end.
Bài toán bao đóng truyền ứng
z Mụctiêu:
– Xác định xem có đường đi nào giữacáccặp đỉnh trong
đồ thị G(V,E) cho trước hay không
z Hướng giảiquyết:
– Sử dụng ma trậnlâncận
– Xác định ma trận đường đi
z Giảithuật: Floyd-Washall
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBKHN 18
Bài toán bao đóng truyền ứng
z Ma trận đường đicủamột đồ thị
– Ma trận đường đi P có kích thướcnxn, đượcxácđịnh sử dụng
công thức
z NếuP
ij
= 1 thì tồntạimột đường đitừđỉnh i đến đỉnh j
z NếuP
ij
= 0 thì không tồntạibấtkỳ một đường đi nào từ i
đếnj trongđồ thị G(V,E)
– Ma trận đường đi P là ma trậnlâncậncủamột đồ thị G


trong
đómỗi cung trong G

chỉ ra rằng có mộtmốiquanhệ liên thông
giữa2 đỉnh.
– G

gọilàbao đóng truyền ứng củaG
)()3()2(

n
AAAAP ∨∨∨∨=
Bài toán bao đóng truyền ứng
z Giảithuậtxácđịnh ma trận đường đicủamột đồ thị
Procedure FLOYD-WARSHALL(A,P,n)
1. P:= A;
2. for k:= 1 to n do
for i:=1 to n do
for j:=1 to n do
P[i,j] := P[i,j] OR (P[i,k] AND P[k,j]);
3. return
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBKHN 19
Bài toán bao đóng truyền ứng
z Ví dụ: Cho đồ thị G và ma trậnlâncậnA
12
34













=
0110
0001
0110
1010
A












=∧=
0111
1010

0111
0110
)2(
AAA












=∧=
1111
0110
1111
0111
)2()3(
AAA
Bài toán bao đóng truyền ứng













=∧=
1111
0111
1111
1111
)3()4(
AAA












=
1111
1111
1111
1111

P
 Ma trận đường điP chỉ chứa các giá trị 1, chứng tỏ trong ma trận đã
cho, giữa2 đỉnh bấtkỳđềutồntại đường đi
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBKHN 20
Bài toán sắpxếp Topo
z Thứ tự bộ phận (Partial Order) là mộtquanhệ có 3 tính
chấtsau
– Tính bắccầu: x<y và y<z thì x<z
– Tính không đốixứng: x<y thì không tồntạiy<x
– Tính không phảnxạ: không tồntạix<x
z MộttậpS cócácphầntử mà giữacácphầntử có một
thứ tự bộ phậnthìS đượcgọilàTậpcóthứ tự bộ phận
Bài toán sắpxếp Topo
z Sắpxếptôpôlàbàitoánđặtratrênmộttậpcóthứ tự
bộ phận
– Mục đích: Sắpxếp các phầntử trong tập đã cho theo một
thứ tự tuyếntínhsaochothứ tự bộ phậnvẫn đảmbảo
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBKHN 21
Bài toán sắpxếp Topo
z Biểudiễntậpcóthứ tự bộ phậnbằng 1 đồ thị có hướng
– Mỗiphầntử củatậpS làmột đỉnh
– Nếutồntạimộtquanhệ i < j thì ta tạomộtcungtừđỉnh i đếnj trên
đồ thị
– Ví dụ:
z Xây móng (1) < Xây tường (2) ;
z Xây tường (2) < Đổ mái (3); Xây tường(2) < Lắpcửa(4)
z Xây tường(2) < Làm điện(5); Lắpcửa(4) < Quét vôi(6)
z Đổ mái (3) <Quét vôi(6) ; Làm điện(5) <Quét vôi(6)

1 2
3
4 5 6
Bài toán sắpxếp Topo
z Quy tắc chung
– Chọnmột đỉnh không có cung nào đitớinóđưa đỉnh đó
ra sắpxếp
– Loại đỉnh vừachọnrakhỏi đồ thị, xóatoànbộ các cung
xuấtpháttừ nó
– Với đồ thị còn lại, lặplại2 bướctrên
– Công việckết thúc khi tấtcả các đỉnh được đưarasắp
xếp
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBKHN 22
Bài toán sắpxếp Topo
z Để cài đặtviệcsắpxếp trên, ta cầnbiết
– Số các cung đi đếnmột đỉnh. Đỉnh đượcchọncógiátrị
này là 0
– Các đỉnh lân cậncủamột đỉnh
– Lưutrữđồthị bằng danh sách lân cậnvớimộtbổ sung
sau
z Nút đầudanhsáchlâncậncủamột đỉnh lưutrữ trong
một vector và mỗi nút có 2 trường
z Trường LINK
z Trường COUNT: lưutrữ số cung đitới đỉnh đó
Bài toán sắpxếp Topo
1 2
3
4 5 6
0

1
1
1
1
3
2
3
4
6
V[1]
V[2]
V[3]
V[4]
V[5]
V[6]
5
6
6
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBKHN 23
Bài toán sắpxếp Topo
z Giảithuật
Procedure TOPO-ORDER(V,n)
1. for i:=1 to n do if COUNT(V[i]) = 0 then nạp i vào trong Q;
2. Repeat
Đưa đỉnh j ở lốitrướccủaQ ra;
ptr := LINK(V[j]); { TÌm đến nút đầu trong danh sách lân cậncủaj}
while ptr khác NULL do begin
k:= VERTEX(ptr) ; {k là đỉnh lân cậncủaj}
COUNT(V[k]) := COUNT(V[k]) -1;

if COUNT(V[k]) = 0 then nạp k vào trong Q;
ptr := LINK(ptr); {Đi đến nút tiếp trong danh sách lân cậncủaj }
end
until Q rỗng
3. return

×