1
Chương 5: Chương 5: Giải thuật trên đồ thịGiải thuật trên đồ thị
5.1. 5.1. Cấu trúc lưu trữ đồ thị bằng dCấu trúc lưu trữ đồ thị bằng danh sách kềanh sách kề
5.2. 5.2. Tìm kiếm trên đồ thịTìm kiếm trên đồ thị
5.3. 5.3. Cây bao trùm ngắn nhấtCây bao trùm ngắn nhất
5.4. 5.4. Sắp xếp tôpôSắp xếp tôpô
22
5.1. Lưu trữ bằng danh sách kề5.1. Lưu trữ bằng danh sách kề Danh sách các đỉnh vDanh sách các đỉnh v11, v, v22,..., v,..., vnn
Danh sách kề của mỗi đỉnh Adj(vDanh sách kề của mỗi đỉnh Adj(vii) , i=1..n) , i=1..n
AD
CB
E
F
A B C ED
B A C
C A B E F
D A F
E A C
F C D
33
5.2. Tìm kiếm trên đồ thị5.2. Tìm kiếm trên đồ thị Tìm kiếm ưu tiên chiều sâuTìm kiếm ưu tiên chiều sâu
Tìm kiếm ưu tiên chiều rộngTìm kiếm ưu tiên chiều rộng Tìm đường đi ngắn nhấtTìm đường đi ngắn nhất
Kí hiệu: V(G)=tập các đỉnh của G, E(G)=tập các Kí hiệu: V(G)=tập các đỉnh của G, E(G)=tập các cạnh của G.cạnh của G.
Hàm Color(u) chỉ trạng thái các đỉnh trong quá Hàm Color(u) chỉ trạng thái các đỉnh trong quá trình tìm kiếm. Color(u) nhận một trong 3 giá trị : trình tìm kiếm. Color(u) nhận một trong 3 giá trị : WHITE, GRAY, BLACK. Lúc đầu, Color(u)=WHITE WHITE, GRAY, BLACK. Lúc đầu, Color(u)=WHITE nghĩa là chưa được xét, với những đỉnh u bắt đầu nghĩa là chưa được xét, với những đỉnh u bắt đầu xét, Color(u)=GRAY, khi u đã xét xong xét, Color(u)=GRAY, khi u đã xét xong Color(u)=BLACKColor(u)=BLACK
44
Nội dung bài toán tìm kiếmNội dung bài toán tìm kiếm Cho đồ thị G=(V,E) và một đỉnh s. Xuất phát từ Cho đồ thị G=(V,E) và một đỉnh s. Xuất phát từ
đỉnh s, hãy duyệt qua tất cả các đỉnh của đồ thịđỉnh s, hãy duyệt qua tất cả các đỉnh của đồ thị
Kí hiệu: Kí hiệu: V(G)=tập các đỉnh của G, E(G)=tập các cạnh của V(G)=tập các đỉnh của G, E(G)=tập các cạnh của
G.G. Hàm Color(u) chỉ trạng thái các đỉnh trong quá Hàm Color(u) chỉ trạng thái các đỉnh trong quá
trình tìm kiếm. Color(u) nhận một trong 3 giá trị : trình tìm kiếm. Color(u) nhận một trong 3 giá trị : WHITE, GRAY, BLACK. Lúc đầu, Color(u)=WHITE WHITE, GRAY, BLACK. Lúc đầu, Color(u)=WHITE nghĩa là chưa được xét, với những đỉnh u bắt đầu nghĩa là chưa được xét, với những đỉnh u bắt đầu xét, Color(u)=GRAY, khi u đã xét xong xét, Color(u)=GRAY, khi u đã xét xong Color(u)=BLACKColor(u)=BLACK
55
5.2.1. Tìm kiếm ưu tiên chiều sâu (DFS)5.2.1. Tìm kiếm ưu tiên chiều sâu (DFS)
Procedure DFS(G)Procedure DFS(G) {Khởi tạo: {Khởi tạo: Mọi đỉnh u chưa được xét Mọi đỉnh u chưa được xét }}1.1. for each u for each u V[G] V[G] 2.2. do color[u]:= do color[u]:= WHITEWHITE ; ;3.3. for each đỉnh u for each đỉnh u V[G] V[G] 4.4. do if color[u] = do if color[u] = WHITEWHITE5.5. then then DFS-VisitDFS-Visit (u) (u)
Procedure DFS-Visit (u)Procedure DFS-Visit (u)1.1. color[u] := color[u] := GRAYGRAY 2.2. for each v for each v Adj[u] do Adj[u] do3.3. if color[v] =if color[v] =WHITEWHITE4.4. then DFS-Visit (v) then DFS-Visit (v) 5.5. color[u]:= color[u]:= BLACKBLACK
Thủ tục đệ quy:Thủ tục đệ quy:
66
Tìm kiếm ưu tiên chiều sâu (DFS)Tìm kiếm ưu tiên chiều sâu (DFS)
Thủ tục không đệ quy: Thủ tục không đệ quy:
Procedure DFS(G,s) Procedure DFS(G,s) 1.1.For each u in V[G] do color[u]:= WHITE ;For each u in V[G] do color[u]:= WHITE ;2.2.color[s]:=GRAY;color[s]:=GRAY;3.3.Push(s,Stack)Push(s,Stack)4.4.While Stack # While Stack # 5.5. u:= Pop(Stack);u:= Pop(Stack);6.6. if có vif có v Adj(u) and color(v)=WHITE then Adj(u) and color(v)=WHITE then 7.7. color(v):=GRAY ; Push(v,Stack); color(v):=GRAY ; Push(v,Stack); 8.8. else color(u):=BLACK;else color(u):=BLACK;9.9.end;end;CHÚ Ý:CHÚ Ý: Hàm Push(v,Stack) đặt phần tử v vào đỉnh ngăn xếp StackHàm Push(v,Stack) đặt phần tử v vào đỉnh ngăn xếp Stack Hàm Pop(Stack) lấy phần tử đửng ở đỉnh ngăn xếp ra khỏi Hàm Pop(Stack) lấy phần tử đửng ở đỉnh ngăn xếp ra khỏi
ngăn xếpngăn xếp
77
Ví dụ:Ví dụ:DFS(A)DFS(A)
A D
CB
E
F
StackStack(Sám)(Sám)
vv Adj(v)Adj(v)TrắngTrắng
Đỉnh trắngĐỉnh trắng Đỉnh Đỉnh đenđen
AA AA B,C,D,EB,C,D,E B,C,D,E,FB,C,D,E,F
A,BA,B BB CC C,D,E,FC,D,E,F
A,B,CA,B,C CC E,FE,F D,E,FD,E,F
A,B,C,EA,B,C,E EE D,FD,F EE
A,B,CA,B,C CC FF DD
A,B,C,FA,B,C,F FF DD
A,B,C,F,A,B,C,F,DD
DD DD
A,B,C,FA,B,C,F FF FF
A,B,CA,B,C CC CC
A,BA,B BB BB
AA AA AA
RỗngRỗng
88
Ví dụ: DFS(A) (tiếp)Ví dụ: DFS(A) (tiếp)
A D
CB
E
F
A D
CB
E
F
A D
CB
E
F
A D
CB
E
F
A D
CB
E
F
A D
CB
E
F
99
Ví dụ: DFS(A) (tiếp)Ví dụ: DFS(A) (tiếp)
A D
CB
E
F
A D
CB
E
F
A D
CB
E
F
A D
CB
E
F
A D
CB
E
F
1010
5.3.2. Tìm kiếm ưu tiên chiều rộng (BFS)5.3.2. Tìm kiếm ưu tiên chiều rộng (BFS) Procedure BFS(G,s)Procedure BFS(G,s) 1.1. for each u for each u V[G] do V[G] do 2.2. color[u]:= WHITE;Prev(u)=Null; color[u]:= WHITE;Prev(u)=Null;
color[s]:=GRAY;color[s]:=GRAY;3.3. Q:= {s}Q:= {s}4.4. While Q # While Q # do do 5.5. u:= Head(Q); /u:= Head(Q); /*lấy u là phần tử đứng đầu *lấy u là phần tử đứng đầu
hàng đợi để xét*hàng đợi để xét*//6.6. For each v For each v Adj(u) Adj(u) 7.7. if color(v)= WHITE then if color(v)= WHITE then 8.8. color(v):=GRAY; Prev(v):= u;color(v):=GRAY; Prev(v):= u;9.9. ENQUEUE(Q,vENQUEUE(Q,v);/*đặt v vào cuối hàng đợi*/);/*đặt v vào cuối hàng đợi*/10.10. DeQueue(Q,u);DeQueue(Q,u);/* Gỡ u khỏi hàng đợi *//* Gỡ u khỏi hàng đợi */11.11. Color(u):= BLACK;Color(u):= BLACK;
1111
Ví dụ:Ví dụ:BFS(A)BFS(A)
A D
CB
E
F
QueueQueue vv Adj(v)Adj(v)TrắngTrắng
Đỉnh trắngĐỉnh trắng Đỉnh Đỉnh đenđen
AA AA B,C,D,EB,C,D,E B,C,D,E,FB,C,D,E,F AA
B,C,D,EB,C,D,E BB FF BB
C,D,EC,D,E CC FF FF CC
D,E,FD,E,F DD DD
E,FE,F EE EE
FF FF FF
RỗngRỗng
1212
Q=B,C,D,Q=B,C,D,EE
A D
CB
E
F
A D
CB
E
F
Ví dụ:Ví dụ:BFS(A)BFS(A)
Q=C,D,EQ=C,D,E
A D
CB
E
F
Q=E,FQ=E,F
A D
CB
E
F
A D
CB
E
F
Q=D,E,FQ=D,E,F
Q=FQ=F
A D
CB
E
F
A D
CB
E
F
Q=RỗngQ=Rỗng
1313
5.2.3. Tìm đường đi ngắn nhất5.2.3. Tìm đường đi ngắn nhất
INPUT:INPUT: G=<V,E> G=<V,E> Hàm trọng số W: E Hàm trọng số W: E RR++
Đỉnh s Đỉnh s V V
OUTPUT:OUTPUT: Đường đi (độ dài) ngắn nhất từ đỉnh s Đường đi (độ dài) ngắn nhất từ đỉnh s
tới tất cả các đỉnh trong Gtới tất cả các đỉnh trong G
1414
Giải thuật DIJSKTRAGiải thuật DIJSKTRA
Tổ chức dữ liệuTổ chức dữ liệu
Với mỗi uVới mỗi u V(G), đặt V(G), đặt LL(u) là độ dài đường đi (u) là độ dài đường đi
ngắn nhất từ s đến u, ngắn nhất từ s đến u, PrePre(u) là đỉnh đứng (u) là đỉnh đứng
trước đỉnh u trên đường đi ngắn nhất từ s trước đỉnh u trên đường đi ngắn nhất từ s
đến u.đến u. Gọi S là tập các đỉnh Gọi S là tập các đỉnh uu đã được tính xong giá đã được tính xong giá
trị hàm L(u);trị hàm L(u); Gọi Q là hàng đợi có ưu tiên gồm các đỉnh Gọi Q là hàng đợi có ưu tiên gồm các đỉnh
chưa tính xong L(u);chưa tính xong L(u);
1515
Giải thuật DIJSKTRA- ngôn ngữ tự nhiênGiải thuật DIJSKTRA- ngôn ngữ tự nhiên
1. {Khởi tạo}1. {Khởi tạo} Với mọi vVới mọi vV(G) đặt V(G) đặt LL(v):= +(v):= +, , PrePre(u)=Null ; (u)=Null ; LL(s):=0; (s):=0;
QQ:= {} (rỗng):= {} (rỗng)
2. 2. {Lặp: Mỗi bước tính xong {Lặp: Mỗi bước tính xong LL(u) của một đỉnh u}(u) của một đỉnh u} 2.1. Nếu mọi đỉnh của G đã nằm trong 2.1. Nếu mọi đỉnh của G đã nằm trong QQ thì dừng. thì dừng. 2.2. Chọn đỉnh u có 2.2. Chọn đỉnh u có LL(u) nhỏ nhất, chưa nằm trong (u) nhỏ nhất, chưa nằm trong SS bổ bổ
sung vào sung vào SS Với mọi v Với mọi v Adj(u) { Adj(u) {tính lại L(v)tính lại L(v)} } nếu nếu LL(v)> (v)> LL(u)+(u)+WW(u,v) thì đặt lại(u,v) thì đặt lại LL(v):= (v):= LL(u)+(u)+WW(u,v) ; Pre(v):=u;(u,v) ; Pre(v):=u; Quay lại 2.1Quay lại 2.1
1616
Giả mã giải thuật DIJSKTRAGiả mã giải thuật DIJSKTRA
Giả mã- Khởi tạoGiả mã- Khởi tạo
For each v in V(G) do For each v in V(G) do
L(v):= +L(v):= +; Pre(v):= Null; ; Pre(v):= Null; Q:=V(G); L(s)= 0; Q:=V(G); L(s)= 0;
Chú giải:Chú giải:
Hàm Q là hàng đợi ưu tiên lúc đầu gồm tất cả các Hàm Q là hàng đợi ưu tiên lúc đầu gồm tất cả các đỉnh của Gđỉnh của G
1717
Giải thuật DIJSKTRAGiải thuật DIJSKTRA Giả mã- Vòng lặpGiả mã- Vòng lặp
While Q # While Q # do do
u:=ExtrackMin(Q);u:=ExtrackMin(Q);
S:=S U {u}S:=S U {u}
For each v in Adj(u) doFor each v in Adj(u) do
if L(v)> L(u)+ W(u,v) if L(v)> L(u)+ W(u,v)
then L(v):= L(u)+ W(u,v); then L(v):= L(u)+ W(u,v); Chú ý:Chú ý:
Q là hàng đợi có ưu tiên với tiêu chuẩn Disk(u) nhỏ Q là hàng đợi có ưu tiên với tiêu chuẩn Disk(u) nhỏ nhất;nhất;
ExtrackMin(Q)ExtrackMin(Q) là thủ tục lấy phần tử có giá trị là thủ tục lấy phần tử có giá trị hàm Disk(u) nhỏ nhất khỏi Qhàm Disk(u) nhỏ nhất khỏi Q
1818
Ví dụ: Dùng giải thuật DIJSKTRA Ví dụ: Dùng giải thuật DIJSKTRA Tìm đường đi ngắn nhất từ A tới tất cả Tìm đường đi ngắn nhất từ A tới tất cả các đỉnh của G.các đỉnh của G.Giá trị hàm L(u) qua các bướcGiá trị hàm L(u) qua các bước
B
A
C
D
E
F
G
32
4
4
1
3
94
5
8
39
Bổ sung vào SBổ sung vào S AA BB CC DD EE FF GG
00
AA 00 33 44 99 22
FF 00 33 33 99 22
BB 00 33 33 77 88 22
CC 00 33 33 77 88 22 66
GG 00 33 33 77 88 22 66
DD 00 33 33 77 88 22 66
EE 00 33 33 77 88 22 66
1919
Mô tả từng bướcMô tả từng bướcB
A
C
D
E
F
G
32
4
4
1
3
94
5
8
39
Bổ sung Bổ sung vào vào SS
Tính lại L(u)Tính lại L(u) Hàm Hàm (u)(u)
AA L(B)=0+3=3, L(C)=0+4=4L(B)=0+3=3, L(C)=0+4=4
L(D)=0+9=9, L(F)=0+2=2L(D)=0+9=9, L(F)=0+2=2(B)=A, (B)=A, (C)=A,..(C)=A,..
FF L(C)=2+1=3, L(G)=2+4=6,L(C)=2+1=3, L(G)=2+4=6,
L(D)=4+3=7L(D)=4+3=7
BB L(E)=3+5=8L(E)=3+5=8
..........
2020
6.3. Tìm cây bao trùm nhỏ nhất6.3. Tìm cây bao trùm nhỏ nhất
Giải thuật PrimGiải thuật Prim Giải thuật KruskalGiải thuật Kruskal
INPUT: INPUT: G=<V,E> liên thông, n đỉnh, m cạnhG=<V,E> liên thông, n đỉnh, m cạnh Hàm trọng số Hàm trọng số : E : E R R++
OUTPUT:OUTPUT: T=<V,E’> cây bao trùm nhỏ nhấtT=<V,E’> cây bao trùm nhỏ nhất
2121
Giải thuật PrimGiải thuật Prim
Mô tả bằng ngôn ngữ tự nhiênMô tả bằng ngôn ngữ tự nhiên/*Khởi tạo: mọi đỉnh chưa xét*//*Khởi tạo: mọi đỉnh chưa xét*/V’:={s}, E’={} (rỗng); n’=1; V’:={s}, E’={} (rỗng); n’=1; While n’ < n doWhile n’ < n do Begin Begin Chọn cạnh (u,v) với u Chọn cạnh (u,v) với u V’, v V’, v V-V’ có V-V’ có (u,v) nhỏ (u,v) nhỏ
nhất nhất V’:=V’ V’:=V’ {v} ; E’:= E’ {v} ; E’:= E’ {(u,v)} ; {(u,v)} ; n’:=n’+1;n’:=n’+1; End;End;Ghi chú: Để lập trình cần dùng một Cấu trúc đống Ghi chú: Để lập trình cần dùng một Cấu trúc đống
cực tiểu và một hàng đợi có ưu tiêncực tiểu và một hàng đợi có ưu tiên
2222
Giả mã Giải thuật PRIMGiả mã Giải thuật PRIM Procedure PRIM(G,w,r);Procedure PRIM(G,w,r);
1.1. Q:=V(G)Q:=V(G)
2.2. For each u in Q do Key(u):= +For each u in Q do Key(u):= +;;3.3. Key(r):=0;Pre(r):=Null;Key(r):=0;Pre(r):=Null;
4.4. While Q # While Q # do do
5.5. u:= Extract(Q);u:= Extract(Q);
6.6. for each v in Adj(u) dofor each v in Adj(u) do
7.7. if v if v Q and Key(v) < w(u,v) thenQ and Key(v) < w(u,v) then
8.8. Key(v):= w(u,v); Pre(v):=u; Key(v):= w(u,v); Pre(v):=u; Ghi chú: Ghi chú: Q là một cấu trúc hàng đợi có ưu tiên theo tiêu chuẩn giá trị Q là một cấu trúc hàng đợi có ưu tiên theo tiêu chuẩn giá trị
hàm Key(u) nhỏ nhất;hàm Key(u) nhỏ nhất; Thủ tục Extract(Q)lấy phần đỉnh có Key(u) nhỏ nhất khỏi Q;Thủ tục Extract(Q)lấy phần đỉnh có Key(u) nhỏ nhất khỏi Q;
2323
Ví dụ: Giải thuật PRIMVí dụ: Giải thuật PRIM
B
A
C
D
E
F
G
36
7
4
10
5
912
9
8
11
9
Bổ sung loại bỏ Bổ sung loại bỏ cạnh đươc xétcạnh đươc xét
Bổ sung Bổ sung cạnhcạnh
Bổ Bổ sung sung đỉnhđỉnh
AA
AB,AC,AD,AFAB,AC,AD,AF ABAB BB
BE,BDBE,BD AFAF FF
FC,FGFC,FG FGFG GG
GC,GD,GEGC,GD,GE ACAC CC
CDCD CDCD DD
GEGE EE
Đủ 7 đỉnhĐủ 7 đỉnh
2424
Giải thuật PRIM (tiếp)Giải thuật PRIM (tiếp)
B
A
C
D
E
F
G
36
7
4
10
5
912
9
8
119
B
A
C
D
E
F
G
36
7
4
10
5
912
9
8
119
B
A
C
D
E
F
G
36
7
4
10
5
912
9
8
119
B
A
C
D
E
F
G
36
7
4
10
5
912
9
8
119
B
A
C
D
E
F
G
36
7
4
10
5
912
9
8
119
B
A
C
D
E
F
G
36
7
4
10
5
912
9
8
119
2525
Đặc trưng của giải thuật PRIMĐặc trưng của giải thuật PRIM
Trong quá trình xây dựng , T luôn là Trong quá trình xây dựng , T luôn là một cây con của G. Khi T chứa tất một cây con của G. Khi T chứa tất cả các đỉnh của G, T trở thành cây cả các đỉnh của G, T trở thành cây bao trùm của Gbao trùm của G
2626
Giải thuật KRUSKALGiải thuật KRUSKAL
Mô tả bằng ngôn ngữ tự nhiênMô tả bằng ngôn ngữ tự nhiênV’:={}, E’={} (rỗng); m’=0; V’:={}, E’={} (rỗng); m’=0; While m’ < n-1 doWhile m’ < n-1 do Begin Begin Chọn cạnh (u,v) có Chọn cạnh (u,v) có (u,v) nhỏ nhất sao (u,v) nhỏ nhất sao
cho khi thêm vào E’ thì T không có chu cho khi thêm vào E’ thì T không có chu trình trình
E’:= E’ E’:= E’ {(u,v)} ; m’:=m’+1; {(u,v)} ; m’:=m’+1;End;End;
2727
Giả mã giải thuật KRUSKALGiả mã giải thuật KRUSKAL Procedure KRUSCALProcedure KRUSCAL1.1. A:= A:= 2.2. For each u in V(G) do Make-Set(u);For each u in V(G) do Make-Set(u);3.3. Sắp xếp các cạnh của E(G) theo trong số Sắp xếp các cạnh của E(G) theo trong số
không giảm w;không giảm w;4.4. For each (u,v) in E(G)For each (u,v) in E(G)5.5. if Find-Set(u)<> Find-Set(v) thenif Find-Set(u)<> Find-Set(v) then6.6. A:= A U (u,v);A:= A U (u,v);7.7. Union(u,v);Union(u,v);Chú ý:Chú ý: A là rừng các cây trong quá trình xây dựngA là rừng các cây trong quá trình xây dựng Make_Set(u) là thủ tục tạo một tập chỉ gồm một phần tử u;Make_Set(u) là thủ tục tạo một tập chỉ gồm một phần tử u; Hàm File-Set(u) tìm tập hợp có chứa phần tử uHàm File-Set(u) tìm tập hợp có chứa phần tử u Thủ tục Union(u,v) thực hiện phép hợp hai tập chứa u và v.Thủ tục Union(u,v) thực hiện phép hợp hai tập chứa u và v.
2828
Giải thuật Giải thuật KruskalKruskal- Ví dụ- Ví dụ
Cạnh xétCạnh xét Các cây trong rừngCác cây trong rừng ChọnChọn
AB(3)AB(3) {A},{B},{C},{D},{E}, {F},{A},{B},{C},{D},{E}, {F},{G}{G}
ABAB
AD(4)AD(4) {A,B},{A,B},{D}{D},,{C},{E},{F}, {G}{C},{E},{F}, {G} ADAD
FG(4)FG(4) {A,B,D}{A,B,D}, {C},{E},{F},{G}, {C},{E},{F},{G} FGFG
BD(5)BD(5) {A,B,D}, {C},{E},{F,G}{A,B,D}, {C},{E},{F,G} ----
CF(6)CF(6) {A,B,D}, {C},{E},{F,G}{A,B,D}, {C},{E},{F,G} CFCF
AF(6)AF(6) {A,B,D}, {E},{A,B,D}, {E},{C,F,G}{C,F,G} AFAF
AC(7)AC(7) {A,B,D,C,F,G}, {A,B,D,C,F,G}, {E}{E} --------
DG(8)DG(8) {A,B,D,C,F,G}, {E}{A,B,D,C,F,G}, {E} --------
EG(8)EG(8) {A,B,D,C,F,G}, {E}{A,B,D,C,F,G}, {E} EGEG
DC(9)DC(9) {A,B,D,C,F,G,E}{A,B,D,C,F,G,E} ----
BE(9)BE(9) {A,B,D,C,F,G,E}{A,B,D,C,F,G,E} ----
B
A
C
D
E
F
G
36
7
4
6
9
45
9
8
8
2929
Giải thuật KRUSKAL: Ví dụGiải thuật KRUSKAL: Ví dụ
Trong quá Trong quá trình xây trình xây dựng T luôn dựng T luôn không có chu không có chu trình nên là trình nên là một rừngmột rừng
B
A
C
D
E
F
G
3
6
7
4
6
9
45
9
8
8
3030
Đặc điểm của giải thuật Đặc điểm của giải thuật KRUSKALKRUSKAL
Trong quá trình xây dựng T có là cây Trong quá trình xây dựng T có là cây không?không?
Trong quá trình xây dựng T luôn Trong quá trình xây dựng T luôn không có chu trình nên là một rừng, không có chu trình nên là một rừng, có thể không là một câycó thể không là một cây
Khi nào một cạnh (u,v) tạo thành một Khi nào một cạnh (u,v) tạo thành một chu trình với các cạnh đã có trong T ?chu trình với các cạnh đã có trong T ?
Khi hai đầu mút u, v thuộc cùng một Khi hai đầu mút u, v thuộc cùng một cây của T cây của T
3131
6.4. Sắp xếp tô pô6.4. Sắp xếp tô pô
Bài toán: Cho một đồ thị có hướng, hãy Bài toán: Cho một đồ thị có hướng, hãy xếp các đỉnh trên một đường thẳng sao xếp các đỉnh trên một đường thẳng sao cho các cạnh luôn hướng từ trái sang phảicho các cạnh luôn hướng từ trái sang phải
B
A
C
FE
D
BA C FED
3232
Giải thuật sắp xếp tôpôGiải thuật sắp xếp tôpô
Ngôn ngữ tự nhiên mô tả thuật Ngôn ngữ tự nhiên mô tả thuật toán tìm sắp xếp tôpô của G=(V,E) toán tìm sắp xếp tôpô của G=(V,E) như sau:như sau:
1.1. Nếu mọi đỉnh của G đều có bậc vào Nếu mọi đỉnh của G đều có bậc vào >0 thì G không có sắp xếp tôpô.>0 thì G không có sắp xếp tôpô.
2.2. Nếu v Nếu v V(G) có bậc vào bằng 0 V(G) có bậc vào bằng 0 (không có cạnh đi vào) thì nó đặt nó (không có cạnh đi vào) thì nó đặt nó ở đầu danh sách, xóa v và các cạnh ở đầu danh sách, xóa v và các cạnh xuất phát từ v khỏi G được G’. Tiếp xuất phát từ v khỏi G được G’. Tiếp tục làm như trên với G’ . tục làm như trên với G’ .
3333
Sắp xếp tôpô – Ví dụSắp xếp tôpô – Ví dụ
A
B
A
C
FE
D
B
F
C
E
DB
F
C
E
D
D
F
C
E
C
FE E FF
3434
Tìm cây bao trùm theo chiều sâuTìm cây bao trùm theo chiều sâu
1. Chọn đỉnh bất kỳ 1. Chọn đỉnh bất kỳ vv00 cho vào cây cho vào cây TT 2. Xét đỉnh 2. Xét đỉnh vv mới cho vào mới cho vào T T và chưa xét xong:và chưa xét xong: Nếu có đỉnh u kề với v và chưa nằm trong Nếu có đỉnh u kề với v và chưa nằm trong
T thì bổ xung cạnh (v,u) và đỉnh u vào T; thay T thì bổ xung cạnh (v,u) và đỉnh u vào T; thay v bằng u để tiếp tục xét đỉnh u như với v; v bằng u để tiếp tục xét đỉnh u như với v;
Nếu tất cả các đỉnh kề với v đều đã nằm Nếu tất cả các đỉnh kề với v đều đã nằm trong T thì đỉnh v đã được xét xong và quay trong T thì đỉnh v đã được xét xong và quay lại xét đỉnh đứng trước v trong quá trình tìm lại xét đỉnh đứng trước v trong quá trình tìm kiếmkiếm
Nếu đỉnh vNếu đỉnh v00 đã được xét xong thì dừng. đã được xét xong thì dừng.
3535
Ví dụ Ví dụ B
A
C
D
E
F
G
XétXét Bổ xung cạnh và đỉnhBổ xung cạnh và đỉnh (v)(v)
AA (AB), đỉnh B(AB), đỉnh B (B)=A(B)=A
BB (BD), đỉnh D (BD), đỉnh D (D)=B(D)=B
DD (DC), đỉnh C (DC), đỉnh C (C)=D(C)=D
CC (CF), đỉnh F(CF), đỉnh F (F)=C(F)=C
FF Không còn,quay lại CKhông còn,quay lại C
CC Không còn, quay lại DKhông còn, quay lại D
DD (CG), đỉnh G(CG), đỉnh G
GG (GE), đỉnh E (GE), đỉnh E
B
A
C
D
E
F
G
3636
Tìm cây bao trùm theo chiều rộngTìm cây bao trùm theo chiều rộng
B
A
C
D
E
F
G
XétXét Bổ xung cạnh và Bổ xung cạnh và đỉnhđỉnh
Số cạnhSố cạnh
AA (AB),(AC),(AD),(AF) (AB),(AC),(AD),(AF) đỉnh B,C,D,Fđỉnh B,C,D,F
44
BB (BE), đỉnh E (BE), đỉnh E 55
CC
DD (DG), đỉnh G(DG), đỉnh G 66 B
A
C
D
E
F
G
3737
Hết chươngHết chương