Các thuật toán duyệt đồ thị• Duyệt đồ thị: Graph Searching hoặc Graph Traversal • Duyệt qua mỗi đỉnh và mỗi cạnh của đồ thị • Ứng dụng: • Cần để khảo sát các tính chất của đồ thị • Là th
Trang 1Chương 3
Các Thuật Toán Duyệt Đồ Thị
(Graph Searching, Graph Traversal)
Trang 2Các thuật toán duyệt đồ thị
• Duyệt đồ thị: Graph Searching hoặc Graph Traversal
• Duyệt qua mỗi đỉnh và mỗi cạnh của đồ thị
• Ứng dụng:
• Cần để khảo sát các tính chất của đồ thị
• Là thành phần cơ bản của nhiều thuật toán trên đồ thị
• Hai thuật toán duyệt cơ bản:
• Tìm kiếm theo chiều rộng (Breadth First Search – BFS)
• Tìm kiếm theo chiều sâu (Depth First Search – DFS)
Trang 3Ý tưởng chung của các thuật toán duyệt
Ý tưởng chung:
• Trong quá trình thực hiện thuật toán, mỗi đỉnh ở một trong ba trạng thái:
• Chưa thăm, thể hiện bởi màu trắng
• Đã thăm (nhưng chưa duyệt xong), thể hiện bởi màu xám
• Đã duyệt xong, thể hiện bởi màu đen
• Trạng thái của đỉnh sẽ biến đổi theo qui tắc sau:
• Thoạt đầu mỗi đỉnh đều có màu trắng (chưa thăm - not visited).
• Đỉnh đã được thăm sẽ chuyển thành màu xám (trở thành đã thăm nhưng chưa duyệt xong - visited).
• Khi tất cả các đỉnh kề của một đỉnh v là đã được thăm, đỉnh v sẽ có màu đen (đã
duyệt xong – discovered).
Trang 4Tìm kiếm theo chiều rộng
Breadth-first Search (BFS)
Trang 5Tìm kiếm theo chiều rộng
Breadth-first Search
• Input: Đồ thị G = (V, E), vô hướng hoặc có hướng
• Output:
• d[v] = khoảng cách (độ dài của đường đi ngắn nhất) từ s (là
đỉnh xuất phát tìm kiếm) đến v, với mọi v V d[v] = nếu v không đạt tới được từ s.
• [v] = u đỉnh đi trước v trong đường đi từ s (là đỉnh xuất phát tìm kiếm) đến v có độ dài d[v].
• Xây dựng cây BFS với gốc tại s chứa tất cả các đỉnh đạt tới được
từ s.
Trang 6BEGIN (* Main Program*)
for v V do (* Khởi tạo *)
Q: hàng đợi các đỉnh được
thăm
color[v]: màu của đỉnh v d[v]: khoảng cách từ s đến v
[u]: đỉnh đi trước v
Ví dụ: xem minh hoạ
Trang 17Phân tích BFS
• Việc khởi tạo đòi hỏi O(|V|).
• Vòng lặp duyệt
• Mỗi đỉnh được nạp vào và loại ra khỏi hàng đợi một lần,
mỗi thao tác đòi hỏi thời gian O(1) Như vậy tổng thời gian làm việc với hàng đợi là O(V).
• Danh sách kề của mỗi đỉnh được duyệt qua đúng mộtlần Tổng độ dài của tất cả các danh sách kề là (|E|).
O(|V|+|E|),là tuyến tính theo kích thước của danh
sách kề biểu diễn đồ thị.
Trang 18• G = (V, E) là cây và được gọi là cây BFS(s)
• Các cạnh trong E được gọi là cạnh của cây |E| = |V| - 1.
• BFS(s) cho phép đến thăm tất cả các đỉnh đạt tới được từ s.
• Trình tự thăm các đỉnh khi thực hiện BFS(s): Đầu tiên đến thăm
các đỉnh đạt được từ s bởi đường đi qua 1 cạnh, sau đó là thăm các đỉnh đạt được từ s bởi đường đi qua 2 cạnh, …Do đó nếu
đỉnh t được thăm trong BFS(s) thì nó sẽ được thăm theo đường
đi ngắn nhất theo số cạnh
Trang 19BFS – Loang trên đồ thị
• Thứ tự thăm đỉnh nhờ thực hiện BFS(A)
C B
A
E
D F
C B
Trang 21Tìm kiếm theo chiều sâu
Depth-first Search (DFS)
Trang 22Ý tưởng của tìm kiếm theo chiều sâu
• Ta sẽ bắt đầu tìm kiếm từ một đỉnh s nào đó của đồ thị Sau đó chọn u là một đỉnh tuỳ ý kề với s và lặp lại quá trình đối với u
• Ở bước tổng quát, giả sử ta đang xét đỉnh v:
• Nếu như trong số các đỉnh kề với v tìm được đỉnh w là chưa
được thăm thì ta sẽ thăm đỉnh này (nó sẽ trở thành đã thămnhưng chưa duyệt xong) và bắt đầu từ nó ta sẽ tiếp tục quá trìnhtìm kiếm
• Nếu như không còn đỉnh nào kề với v là chưa thăm thì ta sẽ nói
rằng đỉnh này là đã duyệt xong và quay trở lại tiếp tục tìm kiếm
từ đỉnh mà trước đó ta đến được đỉnh v (nếu v = s, thì kết thúc
tìm kiếm)
• Có thể nói nôm na là tìm kiếm theo chiều sâu bắt đầu từ đỉnh s
được thực hiện trên cơ sở tìm kiếm theo chiều sâu từ tất cả các
đỉnh chưa thăm kề với s.
Trang 23• f [v] = thời điểm kết thúc thăm (v chuyển từ xám sang đen)
• [v] : đỉnh đi trước v – tức là đỉnh mà từ đó ta đến thăm v.
• Sử dụng biến color để ghi nhận trạng thái của các đỉnh như đã mô tả
Trang 24Depth-First Search: Code
DFS(G)
BEGIN
for v V do
begin color[v] = WHITE;
time = time+1;
d[u] = time;
for v Ke(u)do
if (color[v]= WHITE)then begin
Trang 25Phân tích thuật toán DFS
• Mỗi đỉnh được thăm đúng 1 lần, việc thăm mỗi đỉnh đòi hỏi chi
phí thời gian O(1), suy ra thao tác thăm đỉnh đòi hỏi thời gian
O(|V|).
• Vòng lặp trong DFS(u) thực hiện việc duyệt cạnh của đồ thị
• Mỗi cạnh được duyệt qua đúng một lần nếu đồ thị là có hướng và 2 lần nếu đồ thị là vô hướng
• Như vậy tổng số lần lặp là O(|E|).
• Vậy, thuật toán có thời gian O(|V|+|E|)
• Đối với đồ thị, thuật toán có đánh giá như vậy gọi là thuật toán
thời gian tuyến tính
Trang 26Để hoạt động của thuật toán là xác định, giả thiết rằng ta duyệt các đỉnh trong danh sách kề của một đỉnh theo thứ tự từ điển
Trang 28h d
c b
Trang 30d c
b
Trang 31d c
b
Trang 32h d
c b
Trang 33d b
c
Trang 34h d
c b
Trang 35h
f
d e
Trang 36h
Trang 37f
g
Trang 41g f
h
Trang 42f
h
Trang 43DFS: Các loại cạnh
• DFS(G) sinh ra một cách phân loại các cạnh của đồ thị đã cho:
• Cạnh của cây (Tree edge) : là cạnh mà theo đó từ một đỉnh ta đến thăm một đỉnh mới (cạnh đi vào đỉnh trắng)
• Các cạnh này tạo thành một rừng gọi là rừng tìm kiếm DFS.
• Các đỉnh được thăm khi thực hiện DFS(v) và các cạnh của cây tạo thành
cây được gọi là cây DFS(v)
Trang 44Cây DFS(g)
d c
g f
h b
Trang 45DFS: Cạnh ngược
• DFS tạo ra một cách phân loại các cạnh của đồ thị đã cho:
• Cạnh của cây (Tree edge): là cạnh mà theo đó từ một đỉnh ta đến thăm mộtđỉnh mới (cạnh đi vào đỉnh trắng)
• Cạnh ngược (Back edge): đi từ con cháu (descendent) đến tổ tiên (ancestor)
• Đi vào đỉnh xám (đi từ đỉnh xám đến đỉnh xám)
Trang 46h b
Trang 47DFS: Cạnh tới
• DFS tạo ra một cách phân loại các cạnh của đồ thị đã cho:
• Cạnh của cây (Tree edge): là cạnh mà theo đó từ một đỉnh ta đến thăm mộtđỉnh mới (cạnh đi vào đỉnh trắng)
• Cạnh ngược (Back edge): đi từ con cháu (descendent) đến tổ tiên (ancestor)
• Cạnh tới (Forward edge): đi từ tổ tiên đến con cháu
• Không là cạnh của cây
• Đi từ đỉnh xám đến đỉnh đen
Trang 48g f
h e
b
Trang 49DFS: Cạnh vòng
• DFS tạo ra một cách phân loại các cạnh của đồ thị đã cho:
• Cạnh của cây (Tree edge): là cạnh mà theo đó từ một đỉnh ta đến thăm mộtđỉnh mới (cạnh đi vào đỉnh trắng)
• Cạnh ngược (Back edge): đi từ con cháu (descendent) đến tổ tiên (ancestor)
• Cạnh tới (Forward edge): đi từ tổ tiên đến con cháu
• Cạnh vòng (Cross edge): cạnh nối hai đỉnh không có quan hệ họ hàng
• Không là cạnh của cây, và giống như cạnh vòng cũng
• Đi từ đỉnh xám đến đỉnh đen
Trang 51DFS: Các loại cạnh
• DFS tạo ra một cách phân loại các cạnh của đồ thị đã cho:
• Tree edge: cạnh theo đó từ một đỉnh đến thăm đỉnh mới (trắng)
• Back edge: đi từ con cháu đến tổ tiên
• Forward edge: đi từ tổ tiên đến con cháu
• Cross edge: giữa hai đỉnh không có họ hàng
không đòi hỏi phân biệt cạnh tới và cạnh vòng
Trang 52DFS: Các loại cạnh
• Định lý: Nếu G là đồ thị vô hướng, thì DFS
chỉ sản sinh ra cạnh của cây và cạnh ngược.
• Chứng minh bằng phản chứng:
• Giả sử có cạnh tới (forward edge)
• Nhưng khi đó F phải là cạnh ngược (back
edge)?!
sourc e
F?
Trang 53DFS: Các loại cạnh
• Giả sử có cạnh vòng (cross edge)
• Khi đó C không thể là cạnh vòng bởi vì:
• Nó phải được khảo sát từ một trong hai đỉnhđầu mút và trở thành cạnh của cây trước khiđỉnh kia được khảo sát
• Do đó bức tranh bên là không đúng…cả haicạnh bên không thể là cạnh của cây
source
C?
Trang 54DFS: Phõn biệt cỏc loại cạnh
của các đỉnh và/hoặc xét các giá trị của các
mốc thời gian d và f.
• Khi ta duyệt cạnh e=(u, v) từ đỉnh u, căn cứ vào màu của v ta
cú thể biết cạnh này thuộc loại cạnh nào:
1 WHITE cho biết e là cạnh của cõy
2 GRAY cho biết e là cạnh ngược
3 BLACK cho biết e là cạnh tới hoặc vũng
Trang 56• Do đó thời gian của DFS là (|V|+|E|)
• Thuật toán trên đồ thị có đánh giá thời gian như trên gọi là thuậttoán thời gian tuyến tính
Trang 58Bài toán về tính liên thông
• Bài toán: Cho đồ thị vô hướng G = (V,E) Hỏi đồ thị gồm
bao nhiêu thành phần liên thông, và từng thành phần liên thông gồm các đỉnh nào?
• Giải: Sử dụng DFS (BFS) :
• Mỗi lần gọi đến DFS (BFS) ở trong chương trình chính sẽ sinh
ra một thành phần liên thông
Trang 59DFS giải bài toán liên thông
Trang 60Tìm đường đi
• Bài toán tìm đường đi
• Input: Đồ thị G = (V,E) xác định bởi danh sách kề và hai đỉnh s,
t.
• Đầu ra: Đường đi từ đỉnh s đến đỉnh t, hoặc khẳng định không tồn tại đường đi từ s đến t.
• Thuật toán: Thực hiện DFS(s) (hoặc BFS(s)).
• Nếu [t] = NIL thì không có đường đi, trái lại ta có đường đi
t [t] [[ t]] s
Trang 61DFS giải bài toán đường đi
1 color[u] GRAY (* Thăm đỉnh u *)
2. for each v Adj[u] do
3. if color[v] = WHITE
5. DFS-Visit(v)
Trang 62DFS và Chu trình
• Định lý: Đồ thị G là không chứa chu trình khi và chỉ khi trong quá
trình thực hiện DFS ta không phát hiện ra cạnh ngược.
• Chứng minh:
• Nếu G không chứa chu trình thì rõ ràng không có cạnh ngược (bởi vì sự tồn
tại cạnh ngược dẫn đến phát hiện chu trình)
• Nếu không có cạnh ngược thì G là không chứa chu trình (acyclic) Thực vậy
• Không có cạnh ngược tức là chỉ có cạnh của cây
• Nếu chỉ có cạnh của cây thì G chỉ là cây hoặc rừng
• Vậy G không chứa chu trinh
• Như vậy DFS có thể áp dụng để giải bài toán đặt ra
Trang 639. f[u] time time + 1
• Cần phải điều chỉnh như thế nào để phát hiện chu trình?
Trang 64DFS và chu trình
sát hơn nữa được không?
• Trong một rừng (đồ thị không chứa chu trình) |E| |V| - 1
• Vì vậy nếu đồ thị có |V| cạnh thì chắc chắn nó chứa chu trình, và thuật toán
kết thúc
Trang 65Kiểm tra tính liên thông mạnh
• Mệnh đề: Đồ thị có hướng G=(V,E) là liên thông mạnh khi và chỉ khi
luôn tìm được đường đi từ một đỉnh v đến tất cả các đỉnh còn lại và luôn tìm được đường đi từ tất cả các đỉnh thuộc V \ {v} đến v.
Trang 66Thuật toán kiểm tra tính liên thông mạnh
Trang 67e b
e b
f
Trang 68Định hướng đồ thị
• Bài toán: Cho đồ thị vô hướng liên thông G= (V, E) Hãy tìm
cách định hướng các cạnh của nó để thu được đồ thị có
hướng liên thông mạnh hoặc trả lời G là không định hướng được.
• Thuật toán định hướng : Trong quá trình thực hiện DFS(G)
định hướng các cạnh của cây DFS theo chiều từ tổ tiên
đến con cháu, các cạnh ngược theo hướng từ con cháu
• Bổ đề G là định hướng được khi và chỉ khi G( ) là liên
thông mạnh.
Trang 69e b
f
a
Trang 70Bài tập chương 1
Đồ thị
Trang 71Hai đồ thị sau có đẳng cấu với nhau hay không?
71
A
B
C D
Trang 72Ví dụ:
72
Hai đơn đồ thị G1 và G2 sau là đẳng cấu qua phép đẳng cấu f: a x, bu, cz, dv, ey:
Trang 73Ví dụ:
• Hai đồ thị G1 và G2 sau đều có 5 đỉnh và 6 cạnh nhưng không đẳng cấu vì trong G1 có một đỉnh bậc 4 mà trong G2 không có đỉnh bậc 4 nào
73
Trang 74Ví dụ:
• Hai đồ thị G1 và G2 đều có 7 đỉnh, 10 cạnh, cùng có một đỉnh bậc 4, bốn đỉnh bậc 3 và hai đỉnh bậc 2 Tuy nhiên G1 và G2 là không đẳng cấu vì hai
đỉnh bậc 2 của G1 (a và d) là không kề nhau, trong khi hai đỉnh bậc 2 của G2 (y và z) là kề nhau.
74
Trang 75Ví dụ:
• Hãy xác định xem hai đồ thị sau có đẳng cấu hay không?
75
Trang 76Ví dụ:
• Tìm đỉnh cắt (đỉnh khớp), cạnh cắt (cạnh cầu)
76
Trang 77Bài tập
• Hãy vẽ các đồ thị vô hướng được biểu diễn bởi ma trận liền kề sau
77
Trang 78Bài tập
1 Nêu ý nghĩa của tổng các phần tử trên một hàng (t.ư cột) của một ma trận liền kề đối với một đồ thị vô hướng ? Đối với đồ thị có hướng ?
78
Trang 79Các đồ thị G và G’ sau có đẳng cấu với nhau không?
79
Trang 80• Đồ thị nào có kích thước ma trận liên kề bằng ma trận liên
thuộc (vẽ hình minh họa)
80
Trang 81Bài tập
• Đồ thị vòng có phải là đồ thị phân đôi không? Giải thích, vẽ hình minh họa?
81
Trang 82Cho biết tên gọi của đồ thị?
82
Trang 83Vẽ đồ thị với ma trận liền kề dưới đây.
83
Trang 84Vẽ đồ thị bù của đồ thị sau:
84
Trang 85Bài tập
• Đồ thị nào là đồ thị Hamilton?
Trang 86Bài tập
• Đồ thị có chu trình (đường đi) Hamilton?
Trang 87Bài tập
• Với giá trị nào của m và n các đồ thị phân đôi đầy đủ Km,n có chu trình Hamilton ?
• Vẽ chu trình Hamilton của đồ thị lập phương Q3?
• Tìm đường đi Hamilton trong hình vẽ?
Trang 88Bài tập
• Trong các đồ thị liên thông sau, đồ thị nào chứa chu trình Hamilton
Trang 89Cho các đồ thị có hướng như hình vẽ, đồ thị nào có đường đi Euler :
Trang 90Cho các đồ thị vô hướng như hình vẽ, đồ thị nào
là đồ thị Euler :
Trang 91Có bao nhiêu đỉnh có bậc chẳn?
Trang 92Có bao nhiêu đỉnh có bậc lẻ?
Trang 93• Đồ thị đầy đủ Kn cũng chính là chu trình vòng Cn khi nào?
• Một chu trình vòng Cn là đồ thị phân đôi khi n =?
• Đồ thị nào không có tất cả các đỉnh cùng bậc ?
• Điều kiện nào để đồ thị đầy đủ Kn có đường đi Euler nhưng không có chu trình Euler ?
•
Trang 94Trong các cặp đồ thị sau đây, các cặp đồ thị nào đẳng cấu ?
Trang 95Trong các cặp đồ thị sau đây, các cặp đồ thị nào đẳng cấu ?
Trang 96Đồ thị nào là đồ thị Euler ?
Trang 97Tìm chu trình Euler
Trang 98Bài tập: Xác định tên các đồ thị sau:
Trang 100Tìm chu trình Euler cho đồ thị sau:
• A, B, C, D, E, F, K, G, K, E, C, J, K, H, J, I, H, I, B, I, A