Tải bản đầy đủ (.doc) (46 trang)

Tiểu luận môn học THIẾT KẾ VÀ PHÂN TÍCH THUẬT TOÁN CÁC THUẬT TOÁN CƠ BẢN VỀ ĐỒ THỊ

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 (520.59 KB, 46 trang )

CÁC THUẬT TOÁN CƠ BẢN VỀ ĐỒ THỊ
CÁC THUẬT TOÁN CƠ BẢN VỀ ĐỒ THỊ
Chương này giới thiệu các phương pháp để biểu diễn một đồ thị và để tìm
kiếm một đồ thị. Việc tìm kiếm một đồ thị có nghĩa là chỉ ra các cạnh một cách có
hệ thống của đồ thị để thăm các đỉnh của đồ thị. Một thuật toán tìm kiếm đồ thị có
thể khám phá nhiều về cấu trúc của đồ thị. Một số thuật toán bắt đầu bởi việc tìm
kiếm dữ liệu vào cho đồ thị của chúng để tìm được cấu trúc thông tin đó. Mặt khác
các thuật toán đồ thị được tổ chức để xây dựng đơn giản các thuật toán tìm kiếm đồ
thị cơ bản. Kỹ thuật để tìm kiếm một đồ thị là điểm cốt lõi trong lĩnh vực của các
thuật toán đồ thị.
Mục 22.1 thảo luận hai cách biểu diễn thuật toán thông thường của các đồ thị: như
các danh sách kề và các ma trận kề. Mục 22.2 giới thiệu một thuật toán tìm kiếm
đồ thị đơn giản gọi là tìm kiếm theo chiều rộng và chỉ ra cách khởi tạo một cây tìm
kiếm theo chiều rộng là như thế nào. Mục 22.3 giới thiệu tìm kiếm theo chiều sâu
và cạnh cấp một số kết quả chuẩn về thứ tự thăm các đỉnh trong tìm kiếm chiều
sâu. Mục 22.4 cung cấp cho chúng ta ứng dụng thực đầu tiên của tìm kiếm theo
chiều sâu: sắp xếp tôpô cho một đồ thị vô hướng có chu trình. Một ứng dụng thứ
hai của tìm kiếm theo chiều sâu là việc tìm các thành phần liên thông mạnh của
một đồ thị vô hướng, được trình bày trong Mục 22.5.
22.1 Biểu diễn đồ thị
Đó là 2 phương pháp để biểu diễn một đồ thị G = (V,E): biểu diễn bằng
danh sách lân cận (kề) hoặc bằng ma trận lân cận (kề). Cả hai phương pháp là ứng
dụng của đồ thị vô hướng và đồ thị vô hướng. Sự biểu diễn bằng ma trận kề là luôn
luôn được ưu tiên, bởi vì nó cung cấp một phương pháp chắc chắn để mô tả đồ thị
không đầy đủ - đó là |E| ít hơn |V|
2
.
Hầu hết các thuật toán biểu diễn đồ thị trong sách này cho rằng dữ liệu
vào của đồ thị được biểu diễn trong danh sách kề. Sự biểu diễn một danh sách kề
có thể được ưu tiên tuy nhiên khi đồ thị là đầy đủ - |E| là đúng |V|
2


- hoặc khi chúng
ta cần có thể nói một cách nhanh nếu một cạnh nối bởi 2 đỉnh. Ví dụ, thuật toán
tìm đường đi ngắn nhất 2 của tất cả các cặp được trình bày trong chương 25 cho
rằng dữ liệu vào đồ thị được biểu diễn bởi ma trận kề.
Tiểu luận Thiết kế và phân tích thuật toán - Nhóm 4 Trang 1
CÁC THUẬT TOÁN CƠ BẢN VỀ ĐỒ THỊ
Hình 22.1 Hai cách biểu diễn của một đồ thị vô hướng. (a) Một đồ thị vô hướng G có 5
đỉnh và 6 cạnh. (b) Một biểu diễn danh sách kề của G. (c) Biểu diễn ma trận kề của G.
Hình 22.2 Hai cách biểu diễn của một đồ thị vô hướng. (a) Một đồ thị vô hướng G có 6
đỉnh và 8 cạnh. (b) Một biểu diễn danh sách kề của G. (c) Biểu diễn ma trận kề của G.
Sự biểu diễn ma trận kề của một đồ thị G = (V,E) bao gồm một mảng Adj
lưu danh sách của |V|, mỗi một phần tử là một đỉnh thuộc V. Mỗi đỉnh u

V, danh
sách kề Adj[u] bao gồm tất cả các đỉnh v đó là một cạnh (u,v)

E. Đó là, Adj[u]
bao gồm tất cả danh sách đỉnh để u thuộc G. (Như một sự lựa chọn, nó bao gồm
các đỉnh của các cạnh đó). Các đỉnh trong mỗi danh sách kề được lưu một cách đặc
trưng bởi một thứ tự tuỳ ý. Hình 22.1 (b) là một danh sách kề biểu diễn của đồ thị
vô hướng trong hình 22.1 (a). Tương tự hình 22.2 (b) là một danh sách kề biểu diễn
của đồ thị vô hướng trong hình 22.2 (a).
Nếu G là một đồ thị vô hướng, tổng độ dài của tất cả các danh sách kề là |
E|, khi một cạnh được kết nối bởi (u,v) được biểu diễn bởi có v xuất hiện trong
Adj[u]. Nếu G là một đồ thị vô hướng, tổng độ dài của tất cả các danh sách kề là 2|
E|, nếu (u,v) là một cạnh vô hướng, u xuất hiện trong danh sách kề của v và ngược
lại. Cả hai đồ thị vô hướng và vô hướng, sự biểu diễn danh sách kề có thuộc tính
đáng mong ước rằng tổng số của bộ nhớ mà nó yêu cầu Ө(V + E).
Tiểu luận Thiết kế và phân tích thuật toán - Nhóm 4 Trang 2
CÁC THUẬT TOÁN CƠ BẢN VỀ ĐỒ THỊ

Các danh sách kề có thể dễ dàng thích hợp để biểu diễn các đồ thị có trọng
số, nghĩa là, các đồ thị ứng với mỗi cạnh có gắn một trọng số, đặc trưng bởi một
hàm trọng số w: E → R. Ví dụ, cho G = (V,E) là một đồ thị có trọng số với hàm
trọng số w. Trọng số w(u,v) của cạnh (u,v) ∈ E được lưu trữ đơn giản với đỉnh v
trong danh sách kề của u. Sự biểu diễn danh sách kề là khá mạnh mà nó có thể
được sửa đổi để hỗ trợ nhiều phương án cho các đồ thị khác.
Một khả năng bất lợi của sự biểu diễn danh sách kề là không có phương
pháp nào nhanh hơn để xác định nếu một cạnh đã cho (u,v) có trong đồ thị hơn tìm
kiếm v trong danh sách kề Adj[u]. Điểm bất lợi đó có thể được khắc phục bởi một
sự biểu diễn ma trận kề của đồ thị, ở tại đó chi phí của sử dụng gần với bộ nhớ
hơn. (Quan sát bài tập 22.1-8 cho những đề nghị của các biến đổi trên những danh
sách kề mà cho phép tìm kiếm cạnh nhanh hơn).
Để biểu diễn ma trận kề của một đồ thị G = (V,E), chúng ta cho các đỉnh
được đánh số 1, 2, , |V| trong một số kiểu tùy ý. Vì vậy biểu diễn ma trận kề của
một đồ thị G bao gồm một |V| x |V| ma trận A = (a
ij
) trong đó
ij
1
0
a

=


Hình 22.1 (c) và 22.2 (c) lần lượt là các ma trận kề của đồ thị vô hướng và
có hướng trong hình 22.1 (a) và 22.2 (a). Ma trận kề của một đồ thị yêu cầu Ө(V
2
)
bộ nhớ, độc lập với số cạnh trong đồ thị.

Quan sát tính đối xứng dọc theo đường chéo chính của ma trận kề trong
Hình 22.1 (c). Chúng ta định nghĩa chuyển vị của một ma trận A = (a
ij
) là ma trận
A
T
= (
ij
T
a
) được cho bởi
ij
T
a
=
ji
a
. Do trong một đồ thị vô hướng, (u,v) và (v,u)
biểu diễn cùng một cạnh, ma trận kề A của một đồ thị vô hướng chính là ma trận
chuyển vị của nó A = A
T
. Trong một vài ứng dụng, nó dành để lưu trữ chỉ các danh
sách vào và trên đường chéo của ma trận kề, vì vậy việc phân chia bộ nhớ cần để
lưu trữ hầu hết đồ thị trong một nửa.
Giống như sự biểu diễn danh sách kề của một đồ thị, sự biểu diễn ma trận
kề có thể được sử dụng cho các đồ thị có trọng số. Ví dụ, nếu G = (V,E) là một đồ
thị trọng số với trọng số cạnh bởi hàm w, trọng số w(u,v) ∈ E được lưu trữ một
Tiểu luận Thiết kế và phân tích thuật toán - Nhóm 4 Trang 3
nếu (i,j) ∈ E
ngược lại

CÁC THUẬT TOÁN CƠ BẢN VỀ ĐỒ THỊ
cách đơn giản như danh sách trong dòng u và cột v của ma trận kề. Nếu một cạnh
không tồn tại, một giá trị NIL có thể được lưu trữ như ma trận danh sách tương
ứng của nó, mặc dù đối với một số bài toán là thuận tiện để sử dụng một giá trị là 0
hoặc ∞.
Mặc dù biểu diễn danh sách kề là lân cận ít hiệu quả như biểu diễn ma trận
kề, sự đơn giản của một ma trận kề có thể khiến cho nó thích hợp khi các đồ thị
nhỏ vừa phải. Hơn nữa, nếu đồ thị là không có trọng số, có một thuận lợi trong
việc lưu trữ để biểu diễn ma trận kề. Ngoài ra việc sử dụng một từ của bộ nhớ máy
tính cho mỗi ma trận danh sách, ma trận kề chỉ dùng một bit cho mỗi danh sách.
BÀI TẬP
22.1-1
Cho một biểu diễn danh sách kề của một đồ thị vô hướng, phải mất bao lâu
để tính toán bậc ra của mỗi đỉnh? Phải mất bao lâu để tính toán bậc vào cho mỗi
đỉnh?
22.1-2
Cho một biểu diễn danh sách kề để một cây nhị phân đầy đủ trên 7 đỉnh.
Cho một biểu diễn ma trận kề tương đương. Cho các cạnh được đánh số từ 1 đến 7
như trong một đống nhị phân.
22.1-3
Chuyển vị của một đồ thị vô hướng G = (V , E) là đồ thị G
T
= (V , E
T
),
trong đó E
T
= { (v,u) ∈ V x V: (u,v) ∈ E}. Vì vậy, G
T
là G với tất cả các cạnh đối

nghịch chính nó. Mô tả hiệu quả các thuật toán để tính G
T
từ G, cho cả hai biểu
diễn danh sách kề và ma trận kề của G. Phân tích thời gian thực hiện của thuật toán
đó.
22.1-4
Cho một biểu diễn danh sách kề của một đa đồ thị G = (V , E), mô tả một
thuật toán với thời gian O( V+E) để tính toán biểu diễn một danh sách kề tương
đương với đồ thị vô hướng G’=(V,E’), trong đó E’ bao gồm các cạnh trong E với
tất cả các đa cạnh giữa hai đỉnh thay thế bằng một cạnh đơn và tất cả các cạnh lặp
lại chính nó sẽ bị xóa đi.
22.1-5
Tiểu luận Thiết kế và phân tích thuật toán - Nhóm 4 Trang 4
CÁC THUẬT TOÁN CƠ BẢN VỀ ĐỒ THỊ
Ngang hàng (Square) của một đồ thị vô hướng G = (V,E) là đồ thị G
2
= (V,
E
2
) trong đó (u,w) ∈ E
2
khi va chỉ khi một số v ∈ V, thì cả hai (u,v) ∈ E và (v,w) ∈
E. Nghĩa là, G
2
chứa một cạnh giữa u và v, trong khi G chứa một đường đi với hai
cạnh xác định giữa u và w. Mô tả các thuật tóan hiệu quả để tính tóan G
2
từ G cho
cả hai biểu diễn danh sách kề và ma trận kề của G. Phân tích thời gian thực hiện
của các thuật toán đó.

22.1-6.
Khi một biểu diễn ma trận kề được sử dụng, hầu hết các thuật toán đồ thị
yêu cầu thời gian Ω (V
2
) nhưng có một vài trường hợp ngoại lệ. Chỉ ra rằng việc
xác định bất cứ đồ thị vô hướng G chứa một điểm tập trung (universal sink) - một
đỉnh với bậc vào |V| - 1 và bậc ra 0 có thể được xác định trong thời gian O (V),
được cho bởi ma trận kề của G.
22.1-7.
Ma trận tác động (incident matrix) của một đồ thị vô hướng G = (V,E) là
một |V| x |E|, ma trận B = (b
i j
) trong đó
ij
1
1
0
b



=



Mô tả như thế nào danh sách của ma trận sản phẩm B biểu diễn B
T
, trong
đó B
T

là ma trận chuyển vị của B.
22.1-8.
Giả sử rằng thay thế một danh sách liên kết, mỗi mảng danh sách Adj[u] là
một bảng mới chứa các đỉnh v mà (u,v) ∈ E. Nếu tất cả cạnh tìm kiếm là tương tự
nhau thời gian mong đợi để xử lý bất kỳ một cạnh nào trong đồ thị là bao lâu?
Lược đồ này có những bất lợi gì? Hãy đề nghị một Cấu trúc dữ liệu lần
lượt cho mỗi danh sách cạnh nhằm giải quyết các vấn đề đó? Cấu trúc đó có những
điểm bất lợi so với bảng mới này hay không?
22.2 Tìm kiếm theo chiều rộng (Breadth-first search=BFS):
Tiểu luận Thiết kế và phân tích thuật toán - Nhóm 4 Trang 5
nếu cạnh đi từ đỉnh i đến đỉnh j
nếu cạnh đi từ đỉnh j đến đỉnh i
còn lại
CÁC THUẬT TOÁN CƠ BẢN VỀ ĐỒ THỊ
a) Tìm kiếm theo chiều rộng: là một trong những giải thuật đơn giản nhất
để tìm kiếm một đường đi và là một chuẩn mực của nhiều giải thuật tìm kiếm
đường đi quan trọng khác. Giải thuật tìm kiếm cây khung nhỏ nhất (trong mục
23.2) của Prim và giải thuật tìm đường đi ngắn nhất (trong mục 24.3) của Dijktra
dùng các ý tưởng tương tự với các ý tưởng trong giải thuật tìm kiếm theo chiều
rộng (breadth-first search).
Cho một đồ thị G=(V,E) và một đỉnh gốc s, giải thuật tìm kiếm theo chiều
rộng sẽ tìm kiếm một cách có hệ thống các cạnh của đồ thị G để tìm ra tất cả các
đỉnh của G mà từ s có thể đến được. Giải thuật tính khoảng cách (là số nhỏ nhất
của các cạnh) từ đỉnh s đến từng đỉnh đã tìm được ở trên Giải thuật xây dựng
“một cây tìm kiếm theo chiều rộng ” (có gốc là đỉnh s) chứa tất cả các đỉnh có
thể đến được. Với bất kỳ đỉnh v nào đó đến được từ đỉnh s, thì đường đi từ s đến v
trong cây tìm kiếm theo chiều rộng tương ứng với một đường đi ngắn nhất từ s
đến v trong G, đó là đường đi chứa số nhỏ nhất của các cạnh trong G. Giải thuật áp
dụng được cho cả loại đồ thị có hướng lẫn đồ thị vô hướng.
Được gọi là tìm kiếm theo chiều rộng bởi vì giải thuật này gia tăng giới

hạn giữa các đỉnh được tìm ra và các đỉnh không được tìm ra một cách đồng bộ
trong chiều rộng của giới hạn tìm kiếm. Cụ thể là, giải thuật tìm ra tất cả các đỉnh
có khoảng cách từ s là k trước khi tìm ra bất kỳ đỉnh nào có khoảng cách từ s là
k+1.
Để lưu lại các dấu vết tìm kiếm, giải thuật tô màu trắng, xám hay đen cho
từng đỉnh. Tất cả các đỉnh ban đầu là trắng, sau đó có thể là xám rồi thì thành màu
đen. Trong quá trình tìm kiếm, nếu một đỉnh được gọi là được tìm thấy ở lần đầu
tiên nếu như lần tìm thấy đó nó không phải tô màu trắng. Do đó, các đỉnh có màu
xám và màu đen là những đỉnh được tìm thấy nhưng giải thuật phân biệt giữa
chúng để bảo đảm rằng việc tìm kếm được tiến hành là theo cách tìm kiếm rộng.
Nếu (u,v)

E và đỉnh u có màu đen, thì đỉnh v có màu hoặc là xám hoặc là đen.
Có nghĩa là tất cả các đỉnh liền kề với các đỉnh màu đen đều đã được tìm ra. Các
đỉnh màu xám có thể có thể có các đỉnh kề màu trắng, các đỉnh màu trắng này là
giới hạn giữa các đỉnh tìm ra và các đỉnh không tìm ra.
Giải thuật tìm kiếm rộng xây dựng một cây tìm kiếm theo chiều rộng, ban
đầu chỉ chứa gốc là đỉnh s. Bất cứ khi nào một đỉnh v màu trắng được tìm thấy
Tiểu luận Thiết kế và phân tích thuật toán - Nhóm 4 Trang 6
CÁC THUẬT TOÁN CƠ BẢN VỀ ĐỒ THỊ
trong khi đang tìm một danh sách các đỉnh kề của đỉnh u đã tìm ra tước đó, thì đỉnh
u và cạnh (u,v) được thêm vào cây tìm kiếm. Chúng ta gọi đỉnh u là bố của đỉnh v
trong cây tìm kiếm. Bởi vì chỉ có một đỉnh duy nhất được tìm ra nên nó cũng có
một đỉnh cha duy nhất. Các mối quan hệ ông bà và con cháu trong cây tìm kiếm
theo chiều rộng được định nghĩa liên quan đến đỉnh gốc s như thường lệ: nếu đỉnh
u ở trên đường dẫn trong cây tìm kiếm từ đỉnh s đến đỉnh v thì u là tổ tiên của v và
v là con cháu của u.
Chương trình con tìm kiếm theo chiều rộng (BFS) dưới đây giả định rằng
đồ thị nhập vào G=(V,E) là một danh sách các đỉnh liền kề. Nó có các cấu trúc dữ
liệu thêm vào cho từng đỉnh trong đồ thị. Màu của từng đỉnh u


V được chứa
trong biến color[u]. Các đỉnh đứng trước đỉnh u được chứa trong biến
π
[u] . Nếu
u=s thì
π
[u]=Nil. Khoảng cách từ đỉnh gốc s đến đỉnh u được xác định theo thuật
toán trong d[u]. Giải thuật cũng dùng biến Q là stack vào trước – ra trước (FIFO)
để xem xét bộ các đỉnh màu xám. Hình 22.3 (trang 533) chỉ ra quá trình tìm kiếm
của BFS trên một đồ thị mẫu.
BFS(G,s)
1 for each vertex u

V[G]-{s}
2 do color[u]

WHITE
3 d[u]



4
π
[u]

Nil
5 color[s]

GRAY

6 d[s]

0
7
π
[s]

Nil
8 Q


φ
9 ENQUEUE (Q,s)
10 While Q


φ
11 do u

DEQUEUE (Q)
12 for each v

Adj[u]
13 do if color[v] = WHITE
14 then color[v]

GRAY
15 d[v]

d[u]+1

Tiểu luận Thiết kế và phân tích thuật toán - Nhóm 4 Trang 7
CÁC THUẬT TOÁN CƠ BẢN VỀ ĐỒ THỊ
16
π
[v]

u
17 ENQUEUE (Q,v)
18 color[u]

BLACK
Tiểu luận Thiết kế và phân tích thuật toán - Nhóm 4 Trang 8
CÁC THUẬT TOÁN CƠ BẢN VỀ ĐỒ THỊ
Hình 22.3: Minh hoạ tiến trình của BFS trên đồ thị mẫu
Hình 22.3: Quá trình xử lý của BFS trên đồ thị vô hướng. Các cạnh được tô
đậm khi chúng được xác định bởi BFS. Với mỗi đỉnh u được chỉ ra là d[u]. Biến Q
Tiểu luận Thiết kế và phân tích thuật toán - Nhóm 4 Trang 9
CÁC THUẬT TOÁN CƠ BẢN VỀ ĐỒ THỊ
được chỉ rõ từ lúc bắt đầu mỗi chu kỳ lặp While từ dòng 10-18. Các khoảng cách
từ một đỉnh đến các đỉnh kế tiếp được chỉ ra trong biến Q.
Chương trình con BFS làm việc như sau: với những đỉnh u trong V mà
khác đỉnh s thì đều có màu trắng, khoảng cách từ s đến từng đỉnh u là d[u]=

(không xác định), đặt đỉnh cha của từng đỉnh u là bằng Nil (
π
[u]=Nil). Dòng 5, tô
màu đỉnh s là màu xám vì đỉnh s được xem như là tìm ra khi chương trình bắt đầu.
Dòng 6, khởi tạo khoảng cách d[s]=0, dòng 7, khởi tạo đỉnh cha của s bằng Nil. (
π
[s]=Nil). Dòng 8-9 khởi tạo stack Q chỉ chứa đỉnh s.

Vòng lặp While trong các dòng 10-18 sẽ được thực hiện miễn là các đỉnh
màu xám đang còn, các đỉnh màu xám mà có danh sách các đỉnh kề nó chưa được
xem xét hết đầy đủ. Vòng While này được thực hiện nhờ một điều kiện bất biến
sau:
Ở dòng 10, biến Q bao gồm một tập các đỉnh có màu xám.
Mặc dù, chúng tôi không dùng vòng lặp bất biến này để chứng minh tính đúng
đắn, nhưng thật dễ để nhận ra rằng nó ưu tiên vòng lặp đầu tiên và rằng mỗi lần lặp
lại của vòng lặp duy trì bất biến. Ưu tiên trong vòng lặp đầu tiên, chỉ với các đỉnh
có màu xám, và chỉ với các đỉnh có trong Q, là đỉnh s. Dòng 11 đưa đỉnh u có màu
xám vào ngay đầu danh sách Q và rồi lấy đỉnh u ra khỏi Q liền sau đó. Vòng lặp từ
dòng 12-17 duyệt từng đỉnh v trong danh sách các đỉnh liền kề của đỉnh u. Nếu v
có màu trắng thì nó sẽ chưa được tìm ra và thuật toán sẽ tìm ra nó khi thực hiện các
dòng từ 14 đến 17. Đỉnh v lần đầu được tô màu xám và khoảng cách d[v] được gán
bằng d[u]+1. Sau đó đỉnh u được lưu lại như là đỉnh cha của v. Cuối cùng đỉnh v
được đưa vào cuối của danh sách Q. Khi tất cả các đỉnh trong danh sách các đỉnh
kề của đỉnh u được duyệt hết thì u được tô màu đen theo như dòng 18. Biến vòng
lặp vẫn được duy trì bởi vì bất cứ khi nào một đỉnh được tô màu xám (theo dòng
14) thì nó cũng được đưa vào danh sách Q (theo dòng 17) và bất cứ khi nào một
đỉnh được lấy ra khỏi danh sách Q ( theo dòng 11) thì nó sẽ được tô màu đen (theo
dòng 18).
Các kết quả thu được của giải thuật BFS phụ thuộc vào trật tự mà theo đó,
các đỉnh kề của một đỉnh cho trước đã được xét đến theo dòng 12: cây tìm kiếm
theo chiều sâu có thể thay đổi khác nhau nhưng khoảng các d của đường đi ngắn
nhất được tính bởi giải thuật sẽ không thay đổi. (Xem thêm bài tập 22.2-4).
Tiểu luận Thiết kế và phân tích thuật toán - Nhóm 4 Trang 10
CÁC THUẬT TOÁN CƠ BẢN VỀ ĐỒ THỊ
a.1) Phân tích:
Trước khi chứng minh nhiều đặc tính khác nhau của giải thuật tìm kiếm theo
chiều rộng thì chúng ta hãy xem xét việc dễ dàng hơn là tính toán thời gian chạy
khi đồ thị nhập vào là G = (V,E). Chúng ta sẽ dùng đến các phân tích tổng hợp như

đã được đề cập trong mục 17.1 (trang 406 – sách Introduction to Algorithms –
Thomas H. Cormen). Sau khi nhập dữ liệu vào thì chưa có đỉnh nào có màu trắng,
do đó ở dòng 13 sẽ chắc chắn rằng từng đỉnh một sẽ được sắp xếp vào Q, và sau đó
các đỉnh này cũng sẽ lược lấy ra khỏi Q liền để xem xét. Các lần sắp vào Q rồi lấy
ra từ Q sẽ mất thời gian là O(1). Vì vậy tổng thời gian cho việc sắp vào Q sẽ là
O(V). Bởi vì việc duyệt danh sách các đỉnh liền kề của từng đỉnh chỉ được thực
hiện khi mà chính đỉnh đó đã được lấy ra khỏi Q và đã được duyệt. Do đó, từng
danh sách các đỉnh kề của một đỉnh sẽ được duyệt ngay sau đỉnh đó được duyệt.
Nếu như tổng chiều dài của tất cả các danh sách của các đỉnh kề là O(E) thì tổng
thời gian để duyệt hết các danh sách phải là O(E). Như vậy tổng thời gian chạy của
giải thuật BFS là O(V+E). Do đó, giải thuật này tuyến tính theo thời gian và tuyến
tính theo kích cỡ của danh sách các đỉnh kề, đại diện cho đồ thị G.
a.2) Đường đi ngắn nhất:
Ngay từ lúc ban đầu của mục này, chúng ta đã giả sử rằng: BFS sẽ tìm được các
khoảng cách để đến được từng đỉnh trong đồ thị G=(V,E) từ đỉnh cho trước s

V.
Nếu định nghĩa đường đi có khoảng cách ngắn nhất
δ
(s,v) từ s đến v là đường đi
từ s đến v có số nhỏ nhất các cạnh; Nếu không có đường đi từ s đến v thi
δ
(s,v)=

. Lúc này, độ dài của
δ
(s,v) là đường đi từ s đến v được gọi là đường đi ngắn nhất
từ s đến v. Trước khi chỉ ra BFS thật sự tính ra được đường đi ngắn nhất từ s đến v,
thì chúng ta sẽ tìm hiểu một đặc tính quan trọng của đường đi ngắn nhất.
b) Bổ đề 22.1:

Cho đồ thị G=(V,E) là đồ thị có hướng hoặc vô hướng, và đỉnh s

V bất kỳ,
Với bất kỳ cạnh (u,v)

E ta đều có:
δ
(s,v)<=
δ
(s,u)+1 (1)
Chứng minh bổ đề 22.1:
Nếu từ s đến được u thì s đến được v (vì (u,v)

E). Trong trường hợp này,
đường đi ngắn nhất cần tìm là đường đi ngắn nhất từ s đến u, rồi từ u đi thẳng đến
v theo cạnh (u,v) suy ra bất đẳng thức đã cho đúng. Nếu từ s không thể đến được u
thì
δ
(s,u) =

và suy ra bất đẳng đã cho đúng.
Tiểu luận Thiết kế và phân tích thuật toán - Nhóm 4 Trang 11
CÁC THUẬT TOÁN CƠ BẢN VỀ ĐỒ THỊ
Chúng ta muốn chỉ ra rằng: giải thuật BFS có thể xác định được d[v]=
δ
(s,v)
với mỗi đỉnh v

V. Trước hết chúng ta chỉ ra được d[v] bao
δ

(s,v) dựa vào bổ đề
trên.
c) Bổ đề 22.2:
Cho đồ thị G=(V,E) là đồ thị có hướng hoặc vô hướng, giả sử rằng BFS được
chạy với G và s

V. Với mọi đỉnh v

V, thì BFS sẽ tính được d[v] thỏa điều
kiện: d[v] >=
δ
(s,v) (2)
Chứng minh bổ đề 22.2:
Chúng ta dùng quy nạp dựa vào số các đỉnh được đưa vào Q bằng ENQUEUE.
Giả thiết quy nạp của chúng ta là với mọi đỉnh v

V: d[v] >=
δ
(s,v). Điều cơ bản
của quy nạp là tình huống ngay sau khi đỉnh s được đưa vào danh sách Q theo
dòng 9 của thuật toán BFS.
Giả thiết quy nạp là: d[s]=0=
δ
(s,s)
Và: d[v]=

>=
δ
(s,v) với mọi v


V-{s}
Trong bước quy nạp, duyệt một đỉnh v màu trắng mà được tìm ra trong quá
trình tìm kiếm từ đỉnh u. Từ giả thiết quy nạp ta có: d[u] >=
δ
(s,u)
Từ việc thực hiện câu lệnh gán ở dòng 15 và từ bổ đề 22.1, chúng ta có được:
d[v]=(d[u]+1)>= (
δ
(s,u) +1)>=
δ
(s,v)
Sau đó đỉnh v được đưa vào danh sách Q, và đỉnh v này sẽ không bao giờ được
đưa vào danh sách Q nữa bởi vì nó cũng được tô màu xám và mệnh đề Then từ
dòng 14 đến dòng 17 sẽ chỉ được thực hiện đối với các đỉnh có màu trắng. Do đó,
giá trị của d[v] sẽ không thay đổi nữa và giả thiết quy nạp vẫn được duy trì.
Để chứng minh được rằng d[v]=
δ
(s,v), trước hết chúng ta phải chỉ rõ chính xác
hơn danh sách Q hoạt động như thế nào trong suốt quá trình thực hiện giải thuật
BFS. Bổ đề tiếp theo sẽ chỉ ra rằng sẽ có hai giá trị d phân biệt trong danh sách Q.
d) Bổ đề 22.3:
Giả sử rằng, trong suốt quá trình thực hiện BFS với đồ thị G=(V,E), Q chứa các
đỉnh (v
1
, v
2
, . . . ,v
r
) trong đó v
1

là giá trị đầu của Q, v
r
là giá trị cuối của Q ta có:
d[v
r
]<=d[v
1
]+1
và d[v
i
]<=d[v
i+1
]
với i = 1,2, . . . , (r-1)
Chứng minh bổ đề 22.3:
Tiểu luận Thiết kế và phân tích thuật toán - Nhóm 4 Trang 12
CÁC THUẬT TOÁN CƠ BẢN VỀ ĐỒ THỊ
Lời giải có được từ phương pháp quy nạp dựa vào số lần đưa vào danh sách Q.
Ngay từ đầu khi mà danh sách Q chỉ chứa s, bổ đề chắc chắn đúng.
Trong bước quy nạp, chúng ta sẽ chứng minh là bổ đề này vẫn đúng sau khi đưa
một đỉnh bất kỳ vào và ra khỏi danh sách Q. Nếu v
1
là đỉnh đầu danh sách được lấy
ra thì đỉnh v
2
sẽ trở thành đỉnh đầu danh sách mới (Trường hợp Q trở thành rỗng
thì bổ đề vẫn đúng) Từ giả thiết quy nạp chúng ta suy ra d[v
r
]<=d[v
1

]+1<= d[v
2
]+1
và các bất đẳng thức còn lại thì không bị ảnh hưởng. Vì vậy, theo sau v
2
cũng
giống như ban đầu.
Việc đưa một đỉnh vào danh sách thì cần phải duyệt chương trình kỹ hơn. Khi
chúng ta đưa một đỉnh v theo dòng 17 trong giải thuật BFS vào danh sách Q thì
đỉnh v đó trở thành v
r+1
là đỉnh thứ r+1 trong Q. Lúc này, chúng ta đã xoá đỉnh u
(bởi vì danh sách các đỉnh kề của u đã được duyệt) ra khỏi danh sách Q, và từ giả
thiết quy nạp ta có đỉnh v
1
mới thoã : d[v
1
]>=d[u]
Do đó, d[v
r+1
]=d[v]=(d[u]+1)<=d[v
1
]+1
Cũng từ giả thiết quy nạp, ta có:
d[v
r
]<=d[u]+1
và do đó d[v
r
]<=d[u]+1=d[v]=d[v

r+1
]
và các bất đẳng thức còn lại không ảnh hưởng
Vậy, bổ đề đúng khi v được đưa vào danh sách Q.
Hệ quả sau chỉ ra rằng các giá trị d tại thời điểm các đỉnh được đưa vào danh
sách thì không tăng thêm theo thứ tự thời gian.
e) Hệ quả 22.4:
Giả sử rằng hai đỉnh v
i
và v
j
được sắp trong Q trong quá trình thực hiện BFS, và
giả sử rằng v
i
nằm trước v
j
. Ta có:
d[v
i
]<=d[v
j
] ngay tại thời điểm v
j
được sắp vào Q.
Chứng minh hệ quả:
Ta có ngay từ bổ đề 22.3 và từ các thuộc tính mà mỗi đỉnh nhận một giá trị d
xác định trong suốt quá trình thực hiện giải thuật.
Bây giờ chúng ta có thể chứng minh được rằng : giải thuật tìm kiếm theo chiều
rộng tìm được một cách chính xác khoảng cách đường đi ngắn nhất.
f) Định lý 22.5 (Tính đúng đắn của tìm kiếm theo chiều rộng)

Tiểu luận Thiết kế và phân tích thuật toán - Nhóm 4 Trang 13
CÁC THUẬT TOÁN CƠ BẢN VỀ ĐỒ THỊ
Cho đồ thị G=(V,E) là đồ thị có hướng hoặc vô hướng, giả sử rằng BFS được
chạy với G và s

V. Ta có:
* BFS tìm ra mọi đỉnh v

V mà từ đỉnh s có thể đến được thoã: d[v]=
δ
(s,v).
* Ngoài ra, với bất kỳ đỉnh v

s nào thì một trong những đường đi ngắn nhất từ
s đến v đó là đường đi ngắn nhất từ s đến
π
[v] (đỉnh cha của v) rồi đi theo cạnh (
π
[v],v)
Chứng minh định lý:
Giả sử rằng (để tìm ra mâu thuẫn): có vài đỉnh mà có giá trị d không là giá trị
nhỏ nhất theo đường đi ngắn nhất. Xét đỉnh v là đỉnh có khoảng cách
δ
(s,v) =min
mà thỏa điều giả sử trên (có giá trị d không là giá trị nhỏ nhất): rõ ràng v

s
Theo bổ đề 22.2: d[v] >=
δ
(s,v)

Suy ra: d[v] >
δ
(s,v)
Đỉnh s phải đến được đỉnh v vì nếu không thì
δ
(s,v) =

>= d[v]
Xét đỉnh u là đỉnh liền ngay trước đỉnh v trên đường đi ngắn nhất từ s đến v, ta
có:
δ
(s,v)=
δ
(s,u)+1

δ
(s,u) <
δ
(s,v)
Và d[u]=
δ
(s,u)
Suy ra d[v]>
δ
(s,v)=
δ
(s,u)+1=d[u]+1 (22.1)
Bây giờ chúng ta xét đến thời điểm BFS xoá đỉnh u ra khỏi danh sách Q ở dòng
11. Lúc này đỉnh v hoặc là có màu trắng, hoặc là có màu xám hoặc là có màu đen.
Trong từng trường hợp này chúng ta rút ra được điều mâu thuẫn với bất đẳng thức

(22.1) ở trên.
TH1: nếu v có màu trắng thì theo dòng 15 ta có d[v]=d[u]+1: mâu thuẫn với
(22.1).
TH2: nếu v có màu đen thì theo hệ quả 22.4, khi v đã được xoá khỏi danh sách
Q ta có : d[v]<=d[u]: mâu thuẫn với (22.1)
TH3: nếu v có màu xám có nghĩa là v được tô màu xám khi một đỉnh w nào đó
đứng ngay trước v và đứng sau u, được xoá khỏi danh sách Q. Ta có
d[v]=d[w]+1
Mặt khác theo hệ quả 22.4 thì d[w]<=d[u]
Suy ra: d[v]<=d[u]+1: mâu thuẫn với (22.1)
Vậy, d[v] =
δ
(s,v) với mọi v

V
Tiểu luận Thiết kế và phân tích thuật toán - Nhóm 4 Trang 14
CÁC THUẬT TOÁN CƠ BẢN VỀ ĐỒ THỊ
Chúng ta phải tìm ra được tất cả các đỉnh mà từ s có thể đến được, bởi vì nếu
mà không tìm ra thì thì các giá trị của d phải là không xác định.
Trong phần kết luận của bài toán chúng ta rút ra được:
* nếu
π
[v]=u thì d[v]=d[u]+1
* Chúng ta có thể tìm ra đường đi ngắn nhất bằng cách tìm đường đi ngắn nhất
từ s đến
π
[v] (đỉnh cha của đỉnh v), rồi đi thẳng qua cạnh (
π
[v],v)
g) Cây tìm kiếm theo chiều rộng:

Giải thuật BFS xây dựng cây tìm kiếm theo chiều rộng khi mà nó duyệt qua đồ
thị, xem mô phỏng ở hình 22.3 (trang 533). Cây này được đại diện bởi tập các nút
cha (
π
) của từng đỉnh. Nói một cách trang trọng hơn, với một đỉnh s và đồ thị
G=(V,E), chúng ta định nghĩa một đồ thị con của G chứa các đỉnh đứng trước đỉnh
s, ký hiệu là:
π
G
=(
π
V
,
π
E
) trong đó:
π
V
= {v

V:
π
[v]

Nil}U{s}
and
π
E
= {(
π

[v],v): v

V-{s}}
Đồ thị
π
G
chứa các đỉnh đứng trước s là cây tìm kiếm theo chiều rộng nếu
π
V
gồm tất cả các đỉnh mà đỉnh s có thể đến được và với mọi đỉnh v


π
V
, thì có một
đường đơn duy nhất từ s đến v trong đồ thị
π
G
đó cũng chính là đường đi ngắn nhất
từ s đến v trong G. Một cây tìm kiếm theo chiều rộng thật sự là một cây bởi vì nó
được kết nối và thỏa:
1−=
ππ
VE
(xem thêm Định lý B.2). Còn các cạnh trong
π
E
được gọi là các nhánh cây.
Sau khi giải thuật BFS thực hiện từ đỉnh s trên G, thì bổ đề sau chỉ rõ rằng đồ
thị con chứa các đỉnh đứng trước đỉnh s là một cây tìm kiếm.

h) Bổ đề 22.6:
Khi BFS được thực hiện với đồ thị có hướng hoặc vô hướng G=(V,E), thì nó sẽ
xây dựng tập
π
(tập các đỉnh đứng trước đỉnh s) để cho đồ thị con
π
G
=(
π
V
,
π
E
) là
một cây tìm kiếm.
Chứng minh bổ đề:
Dòng 16 của BFS sẽ gán
π
[v]=u nếu và chỉ nếu (u,v)

V và
δ
(s,v)<

- nghĩa
là, nếu s có thể đến được v thì
π
V
sẽ bao gồm các đỉnh trong V mà s có thể đến
được. Theo định lý B.2, vì

π
G
là một cây nên nó sẽ chứa một đường đi duy nhất đi
Tiểu luận Thiết kế và phân tích thuật toán - Nhóm 4 Trang 15
CÁC THUẬT TOÁN CƠ BẢN VỀ ĐỒ THỊ
từ s đến mỗi đỉnh trong
π
V
. Bằng cách áp dụng định lý 22.5, chúng sẽ rút ra được
mỗi đường đi trong sẽ là đường đi ngắn nhất
π
G
Thủ tục sau đây sẽ in ra các đỉnh trên đường đi ngắn nhất từ s đến v, giả sử rằng
BFS đã được chạy và tìm ra cây chứa đường đi ngắn nhất.
PRINT-PATH(G,s,v)
1. if v=s
2. then print s
3. else if
π
[v]=Nil
4. then print “no path from” s “to” v “exit”
5. else PRINT-PATH(G, s,
π
[v])
6. print v
Thủ tục này tuyến tính theo thời gian, phụ thuộc vào số lượng các đỉnh tìm
được trong đường đi được in ra, vì rằng lời gọi đệ quy được dùng để tìm đường đi
ngắn hơn cho mỗi đỉnh.
Bài tập:
22.2-1: Tìm kết quả của d và

π
dùng giải thuật tìm kiếm theo chiều rộng trên
đồ thị có hướng ở hình 22.2(a) với đỉnh gốc là đỉnh 3.
22.2-2: Tìm kết quả của d và
π
dùng giải thuật tìm kiếm theo chiều rộng trên
đồ thị vô hướng ở hình 22.3 với u là đỉnh gốc.
22.2-3: Số lần chạy của giải thuật BFS là bao nhiêu nếu đồ thị nhập vào của giải
thuật là một ma trận kề và giải thuật này được hiệu chỉnh để dùng được với ngõ
vào có dạng này?
22.2-4: Giả sử rằng giải thuật tìm kiếm theo chiều rộng, giá trị d[u], mà được
tính cho một đỉnh u, là không phụ thuộc vào các đỉnh trong danh sách liên kết cho
trước. Xét ví dụ ở hình 22.3, hãy chứng tỏ rằng cây tìm kiếm theo chiều rộng, được
tìm ra bởi giải thuật BFS, thì có thể phụ thuộc vào thứ tự trong các danh sách các
đỉnh kề.
22.2-5: Cho ví dụ về một đồ thị có hướng G = (V,E), một đỉnh s

V, và một bộ
các cạnh
π
E

E ứng với mỗi đỉnh v

V, đường đi duy nhất trong đồ thị (V,
π
E
)
từ s đến v là đường đi ngắn nhất trong đồ thị G, tuy nhiên vẫn không thể tìm được
Tiểu luận Thiết kế và phân tích thuật toán - Nhóm 4 Trang 16

CÁC THUẬT TOÁN CƠ BẢN VỀ ĐỒ THỊ
một bộ các cạnh
π
E
khi chạy giải thuật BFS trên đồ thị G, cho dù là các đỉnh được
sắp xếp như thế nào trong danh sách các đỉnh liền kề.
22.2-6: Có hai loại người đô vật chuyên nghiệp: “người vật hay” và “người vật
dở”. Giữa bất kỳ một cặp đô vật chuyên nghiệp nào có thể có hoặc không có trận
đấu. Giả sử rằng chúng ta có n đô vật chuyên nghiệp một danh sách các cặp đấu.
Hãy viết giải thuật có độ phức tạp O(n+r) xác định xem có thể chỉ ra các cặp đấu
đấu giữa một “người vật hay” với một “người vật dở” không và in ra kết quả danh
sách đó.
22.2-7: Kích thước của một cây T được xác định bởi

),(max
,
vu
Vvu
δ

Chính là giá trị lớn nhất trong tất cả các khoảng cách của đường đi nhỏ nhất
trong cây tìm kiếm theo chiều rộng. Hãy viết một giải thuật để tính kích thước của
một cây, xác định độ phức tạp của giải thuật.
22.2-8: Cho đồ thị vô hướng và liên thông G=(V,E). Hãy viết một giải thuật có
độ phức tạp là O(V+E) để tìm đường đi trong đồ thị G qua từng cạnh trong E chỉ
một lần theo mỗi hướng.
22.3. Tìm kiếm theo chiều sâu (DFS):
Đi theo chiến lược tìm kiếm theo chiều sâu là, như tên của nó ngụ ý để có
thể tìm kiếm “sâu hơn” trong đồ thị bất cứ khi nào. Trong tìm kiếm theo chiều sâu,
các cạnh được thăm ngoài đỉnh mới tìm thấy nhất v vẫn không thăm những cạnh

rời nó. Khi tất cả những cạnh của v đã được thăm, tìm “ rút ngược” để thăm các
cạnh xa đỉnh v đã tìm thấy. Tiếp tục quá trình cho đến khi chúng ta tìm thấy tất cả
các đỉnh để tới được đỉnh gốc. Nếu còn một vài đỉnh chưa tìm thấy, thì một trong
số chúng được chọn làm gốc mới và quá trình tìm kiếm được lặp lại từ các gốc
khác. Toàn bộ quá trình được lặp lại cho đến khi tất cả các cạnh được tìm thấy.
Vì trong tìm kiếm theo chiều sâu, bất cứ lúc nào 1 đỉnh v được tìm thấy
trong suốt danh sách đỉnh liền kề với đỉnh đã tìm thấy u, những mẫu tin tìm kiếm
theo chiều sâu tại sự kiện này được đặt trong trường trước π[v] của đỉnh v đến đỉnh
u. Không như tìm kiếm theo chiều rộng, đồ thị con ở trước tạo thành 1 cây, đồ thị
con ở trước đem lại bởi tìm kiếm theo chiều sâu lập ra một số cây, vì cách tìm
Tiểu luận Thiết kế và phân tích thuật toán - Nhóm 4 Trang 17
CÁC THUẬT TOÁN CƠ BẢN VỀ ĐỒ THỊ
kiếm này có thể lặp lại từ nhiều nguồn ( Tìm kiếm theo chiều rộng bị giới hạn chỉ
trong 1 nguồn trong khi theo chiều sâu là từ nhiều nguồn. Mặc dù 1cách khái niệm,
tìm kiếm theo chiều rộng có thể tiến hành từ nhiều nguồn và tìm kiếm theo chiều
sâu có thể bị giới hạn trong 1 nguồn, cách tiếp cận của chúng ta phản chiếu cách
thức kết quả tìm kiếm được sử dụng điển hình. Tìm kiếm theo chiều rộng thường
được dùng để tìm những khoảng cách ngắn nhất từ 1 nguồn được cho. Tìm kiếm
theo chiều sâu thường là 1 chương trình con trong 1 thuật toán khác, chúng ta sẽ
gặp lại sau trong chương này). Đồ thị con ở trước của tìm kiếm theo chiều sâu
được định nghĩa sơ sài khác với của tìm kiếm theo chiều rộng: chúng ta để
G
π
=(V, E
π
), nơi
E
π
={(π[v],v) : v є G
π

=V và π[v] ≠ nil}.
Đồ thị con ở trước của tìm kiếm theo chiều sâu tạo 1 rừng tìm kiếm theo chiều
sâu thành lập một vài cây tìm kiếm chiều sâu. Các cạnh trong E
π
được gọi là các
cạnh cây.
Vì trong tìm kiếm theo chiều rộng, các đỉnh được tô màu trong suốt quá
trình tìm kiếm để chỉ trạng thái của nó. Mỗi đỉnh đầu tiên màu trắng, bị tô xám khi
nó được tìm thấy trong quá trình tìm kiếm, và bị tô đen khi kết thúc,danh sách đỉnh
liền kề với nó được kiểm tra đầy đủ. Kỹ thuật này đảm bảo ràng mỗi đỉnh kết thúc
trên chính xác một cây tìm kiếm chiều sâu, vì thế những cây này tách riêng.
Bên cạnh khởi tạo một rừng tìm kiếm chiều sâu, tìm kiếm theo chiều sâu
cũng gắn nhãn thời gian mỗi đỉnh. Mỗi đỉnh v có 2 nhãn thời gian: gắn nhãn đầu
tiên d[v] khi đỉnh v được tìm thấy đầu tiên ( và tô màu xám ), và gắn nhãn thứ 2
khi quá trình tìm kiếm kết thúc việc kiểm tra danh sách đỉnh liền kề v ( đỉnh v được
tô đen). Những nhãn thời gian này được sử dụng trong nhiều thuật toán đồ thị và
thường hữu ích trong lý do về cách hoạt động của tìm kiếm theo chiều sâu.
Thủ tục DFS ở dưới chỉ ra nó tìm thấy đỉnh u trong biến d[u], và khi nó kết
thúc đỉnh u trong biến f[u]. Những nhãn thời gian này là những số nguyên giữa 1
và 2|V|, từ lúc có 1 sự kiện được tìm thấy và 1 sự kiện kết thúc cho mỗi |V| đỉnh.
Cho mỗi đỉnh u,
Tiểu luận Thiết kế và phân tích thuật toán - Nhóm 4 Trang 18
CÁC THUẬT TOÁN CƠ BẢN VỀ ĐỒ THỊ
d[u] < f[u] (22.2)
Đỉnh u là màu trắng trước d[u], màu xám giữa d[u] và f[u], và sau đó là màu đen.
Quá trình giải mã theo 1 thuật toán tìm kiếm chiều sâu cơ bản. Đầu vào của
đồ thị G có thể vô hướng hoặc có hướng. Biến time là 1 biến toàn cục mà chúng ta
sử dụng gắn nhãn thời gian.
DFS(G)
1 mỗi đỉnh u є V[G]

2 Thực hiện tô màu color[u] ← màu trắng
3 π[u] ← nil
4 time ← 0
5 mỗi đỉnh u thuộc V[G]
6 Nếu color[u] =màu trắng
7 Thì DFS-thăm(u)
DFS- Visit(u)
1 color[u] ← màu xám { đỉnh màu trắng u vừa được tìm thấy}
2 time ← time +1
3 d[u] ← time
4 Mỗi đỉnh v thuộc lân cận u Adj[u] { thăm cạnh (u, v)}
5 Nếu color[v] =màu trắng
6 Thì π[v] ←u
7 DFS-thăm(v)
8 color[u] ← màu đen {tô đen đỉnh u, u kết thúc}
9 f [u] ← time ← time +1
Hình 22.4 minh họa tiến triển của DFS trong đồ thị ở hình 22.2
Tiểu luận Thiết kế và phân tích thuật toán - Nhóm 4 Trang 19
CÁC THUẬT TOÁN CƠ BẢN VỀ ĐỒ THỊ
Hình 22.4 Quá trình của thuật toán DFS tìm kiếm theo chiều sâu ở 1 đồ thị có hướng.
Khi các cạnh được thăm bởi thuật toán, chúng được thể hiện hoặc là tô đậm (nếu chúng
là cạnh tree) hoặc là đứt nét (trong trường hợp khác). Các cạnh nontree được dán nhãn
B, C, F tùy theo chúng là các cạnh sau, chéo, trước. Những đỉnh được gắn nhãn thời
gian là thời gian tìm thấy hay thời gian kết thúc.
Thủ tục DFS làm theo như sau. Những dòng 1-3 tô tất cả các cạnh màu trắng và
khởi tạo trường π = NIL. Dòng 4 đặt biến đếm toàn cục. Dòng 5-7 kiểm tra lần lượt
mỗi đỉnh trong V, khi 1 đỉnh màu trắng được tìm thấy, thăm nó sử dụng DFS-Visit.
Mỗi lần DFS-Visit(u) được gọi ở dòng 7, đỉnh u trở thành gốc của 1 cây mới trong
rừng duyệt sâu. Khi DFS trở lại, mỗi đỉnh u được gắn 1 thời gian tìm thấy d[u] và 1
thời gian kết thúc f[u].

Mỗi lần gọi DFS-Visit(u), đỉnh u đầu tiên tô màu trắng. Dòng 1 tô u màu xám,
dòng 2 tăng biến toàn cục time, dòng 3 lưu giá trị biến time mới là biến thời gian
tìm thấy d[u]. Dòng 4-7 kiểm tra đỉnh lân cận v đến u và thực hiện đệ quy thăm v
Tiểu luận Thiết kế và phân tích thuật toán - Nhóm 4 Trang 20
CÁC THUẬT TOÁN CƠ BẢN VỀ ĐỒ THỊ
nếu nó màu trắng. Vì mỗi đỉnh v thuộc Adj[u] được xem xét ở dòng 4, chúng ta nói
rằng cạnh (u,v) được thăm bởi tìm kiếm theo chiều sâu. Cuối cùng, sau khi mỗi
cạnh rời u được thăm, các dòng 8-9 tô đen u và lưu biến kết thúc thời gian trong
f[u].
Lưu ý rằng những kết quả thu được từ tìm kiếm theo chiều sâu có thể phụ
thuộc sự sắp xếp những đỉnh được kiểm tra ở dòng 5 của DFS và sự sắp xếp vào
những đỉnh lân cận đã được thăm ở dòng 4 của DFS-Visit. Thứ tự thăm khác nhau
có khuynh hướng không phải là nguyên nhân những vấn đề bình thường, vì bất kì
kết quả tìm kiếm theo chiều sâu có thể luôn được sử dụng có hiệu quả, với những
kết quả tương đương thiết yếu.
Thời gian thực hiện của DFS là gì? Những vòng lặp ở dòng 1-3 và dòng 5-7
của DFS nhận thời gian Ө(V), loại trừ thời gian để thực hiện lời gọi DFS-Visit.
Như chúng ta đã làm trong tìm kiếm theo chiều sâu, chúng ta sử dụng phân tích
tổng thể. Thủ tục DFS-Visit được gọi chính xác 1 lần trong mỗi đỉnh v є V, DFS-
Visit chỉ được kéo theo trên những đỉnh màu trắng và điều đầu tiên nó làm là sơn
đỉnh màu xám. Suốt quá trình thực hiện của DFS-Visit(v), vòng lặp trên dòng 4-7
được thực hiện |Adj[v]| lần. Từ khi
∑ |Adj[v]| = Ө(E),
i є V
tổng giá trị thực hiện dòng 4-7 cúa DFS-Visit là Ө(E). Thời gian thực hiện của
DFS là Ө(V+E).
Những thuộc tính của tìm kiếm chiều sâu.
Tìm kiếm chiều sâu mang lại giá trị thông tin về cấu trúc của đồ thị. Có lẽ thuộc
tính cơ bản nhất của tìm kiếm theo chiều sâu là đồ thị con ở trước G
π

thực hiện 1
rừng cây. Từ cấu trúc của cây tìm kiếm chiều sâu phản ánh chính xác cấu trúc của
lời gọi đệ quy của DFS-Visit. Đó là, u=π[v] nếu và chỉ nếu DFS-Visit(v) được gọi
suốt trong quá trình tìm kiếm danh sách lân cận của đỉnh u. Thêm vào đó, đỉnh v là
con của đỉnh u trong trong rừng tìm kiếm chiều sâu nếu và chỉ nếu đỉnh v được tìm
thấy suốt thời gian đỉnh u tô xám.
Tiểu luận Thiết kế và phân tích thuật toán - Nhóm 4 Trang 21
CÁC THUẬT TOÁN CƠ BẢN VỀ ĐỒ THỊ
Một thuộc tính quan trọng khác của tìm kiếm chiều sâu là những thời gian
tìm thấy và kết thúc có cấu trúc dấu ngoặc đơn. Nếu chúng ta cho tìm thấy đỉnh u
là ngoặc mở “(u” và kết thúc là ngoặc đóng “u)” thì lịch sử của tìm thấy và kết thúc
làm thành 1 công thức tốt biểu thị ý nghĩa là những dấu ngoặc đơn được lồng nhau
đúng mức. Ví dụ trong tìm kiếm chiều sâu ở hình 22.5(a) tương ứng vơi dấu ngoặc
đơn chỉ ra trong hình 22.5(b). Một cách khác của trạng thái diều kiện cấu trúc dấu
ngoặc đơn được đưa ra bởi định lý sau
Định lý 22.7(Định lý dấu ngoặc đơn)
Trong bất kỳ tìm kiếm chiều sâu của 1 đồ thị ( có hướng hay vô hướng) G=(V,E),
với 2 đỉnh u và v, chính xác 1 trong ba điều kiện sau được thực hiện:
• Các khoảng [d[u], f[u]] và [d[v], f[v]] hoàn toàn được tách riêng, cả đỉnh u
lẫn v đều không là con của đỉnh khác trong rừng tìm kiếm chiều sâu.
• Khoảng [d[u], f[u]] là được chứa hoàn toàn trong khoảng [d[v], f[v]], và u là
con của v trong 1 cây tìm kiếm sâu, hoặc
• Khoảng [d[v], f[v]] là được chứa hoàn toàn trong khoảng [d[u], f[u]], và v là
con của u trong 1 cây tìm kiếm sâu.
Tiểu luận Thiết kế và phân tích thuật toán - Nhóm 4 Trang 22
CÁC THUẬT TOÁN CƠ BẢN VỀ ĐỒ THỊ
Hình 22.5 Thuộc tính của tìm kiếm chiều sâu. (a) Kết quả của tìm kiếm chiều sâu
của đồ thị có hướng. Các đỉnh được gắn nhãn thời gian và các loại cạnh được chỉ ra như
hình 22.4. (b) Các khoảng thời gian tìm kiếm và thời gian kết thúc của mỗi đỉnh tương
ứng đến chỉ ra các dấu ngoặc đơn. Mỗi khoảng cách chiều dài tam giác cho bởi thời

gian tìm kiếm và thời gian kết thúc của đỉnh tương ứng. Các cạnh được chỉ ra. Nếu 2
khoảng cách gối lên nhau, thì 1 cái được thêm vào trong cái kia, và đỉnh tương ứng đến
khoảng cách nhỏ hơn là con của đỉnh tương ứng đến lớn hơn. (c) Đồ thị của phần vẽ lại
với tất cả cây và các cạnh trước giảm(going down) trong 1 cây tìm kiếm chiều sâu và tất
cả các cạnh sau tăng (going up) từ con đến gốc.
Tiểu luận Thiết kế và phân tích thuật toán - Nhóm 4 Trang 23
CÁC THUẬT TOÁN CƠ BẢN VỀ ĐỒ THỊ
Chứng minh Chúng ta bắt đầu trong trường hợp d[u] <d[v]. Có 2 trường hợp được
xem xét, dựa theo d[v] <f[u] hoặc không. Trường hợp thứ nhất xảy ra khi d[v] <
f[u], vì đỉnh v được tìm thấy trong khi đỉnh u vẫn con tô xám. Điều này ngụ ý rằng
v là con u. Hơn nữa, từ khi v được tìm thấy sớm hơn u, tất cả những cạnh rời nó
(outgoing) đã được thăm, và kết thúc v, trước khi tìm kiếm quay lại và kết thúc u.
Trong trường hợp này, vì thế khoảng [d[v],f[v]] được chứa trong toàn bộ khoảng
[d[u],f[u]]. Trong trường hợp khác, f[u] < d[v], và những ngụ ý khác nhau là các
khoảng [d[u],f[u]] và [d[v],f[v]] được tách riêng. Bởi vì các khoảng được tách
riêng, không đỉnh nào được tìm thấy trong khi đỉnh khác màu xám, và vì thế không
đỉnh nào là con của đỉnh khác.
Trong trường hợp d[v] < d[u] cũng tương tự, với vai trò của u và v đảo
ngược.
Hệ quả 22.8 ( các khoảng con lồng nhau )
Đỉnh v thích hợp là con của đỉnh u trong rừng tìm kiếm chiều sâu cho đồ thị G (có
hướng hay vô hướng) khi và chỉ khi d[u] < d[v] < f[v] < f[u].
Chứng minh từ định lý 22.7
Định lý tiếp theo cho đặc trưng quan trọng khác khi 1 đỉnh là con của đỉnh
khác trong rừng tìm kiếm chiều sâu.
Định lý 22.9 ( định lý đường đi màu trắng)
Trong rừng tìm kiếm chiều sâu của 1 đồ thị ( có hướng hay vô hướng) G = (V,E),
đỉnh v là con của đỉnh u nếu và chỉ nếu tại thời điểm d[u] mà tìm kiếm phát hiện u,
đỉnh v có thể đi đến từ u dọc theo 1 con đường được xem là toàn những đỉnh màu
trắng.

Chứng minh
=>:
Giả thiết rằng v là con của u. Đặt w là đỉnh bất kỳ trên đường đi giữa u và v trong
cây tìm kiếm chiều sâu, để w là con của u. Theo hệ quả 22.8, d[u] < d[w], và vì w
là màu trắng tại thời điểm d[u].
<=:
Giả thiết rằng đỉnh v là đến từ u dọc theo con đường các đỉnh màu trắng tại thời
điểm d[u], nhưng v không trở thành con u trong cây tìm kiếm chiều sâu. Không
Tiểu luận Thiết kế và phân tích thuật toán - Nhóm 4 Trang 24
CÁC THUẬT TOÁN CƠ BẢN VỀ ĐỒ THỊ
mất tính tổng quát, với mọi đỉnh khác dọc theo con đường đó trở thành con của u. (
Trong trường còn lại để v là đỉnh riêng đến u dọc theo con đường đó mà không trở
thành con của u ). Đặt w là đỉnh trước v trên đường, để w là con của u ( w và u thật
ra có thể là đỉnh giống nhau), theo hệ quả 22.8, f[w] ≤ f[u]. Chú ý rằng v phải được
tìm thấy sau khi u được tìm thấy, nhưng trước khi w kết thúc. Vì thế, d[u] < d[v] <
f[w] ≤ f[u]. Định lý 22.7 ngụ ý ràng khoảng [d[v],f[v]] chứa hoàn toàn trong
khoảng [d[u],f[u]]. Theo hệ quả 22.8, v cuối cùng phải là con của u.
Phân loại các cạnh
Một thuộc tính thú vị khác của tìm chiều sâu là quá trình tìm kiếm có thể sử
dụng để phân loại các cạnh của đầu vào đồ thị G = (V,E). Phân loại các cạnh có thể
sử dụng để nhặt thông tin quan trọng về đồ thị. Ví dụ, trong phần tiếp, chúng ta sẽ
gặp 1 đồ thị có hướng không có chu kỳ khi và chỉ khi tìm kiếm chiều sâu không
mang lại cạnh “sau” ( Bổ đề 22.11)
Chúng ta có thể định nghĩa 4 loại cạnh trong các thuật ngữ của rừng chiều
sâu G
π
tạo ra bởi tìm kiếm chiều sâu trong G
1. Các tree là các cạnh trong rừng tìm kiếm chiều sâu G
π
. Cạnh (u,v) là 1 cạnh

tree nếu v tìm thấy đầu tiên bằng cách thăm cạnh (u,v).
2. Các cạnh sau là những cạnh (u,v) nối với 1 đỉnh u đến đỉnh gốc v trong cây
tìm kiếm chiều sâu. Các khuyên có thể xảy ra trong các đồ thị có hướng,
được xem là các cạnh sau
3. Các cạnh trước là các cạnh nontree (u,v) nối với 1 đỉnh u đến đỉnh con v
trong cây chiều sâu
4. Các cạnh chéo là những cạnh còn lại. Chúng có thể đi giữa những đỉnh
trong cùng 1 cây chiều sâu, miễn là đỉnh đó không phải là 1 gốc của cây
khác, hoặc chúng có thể đi giữa các đỉnh trong các cây chiều sâu khác nhau.
Trong hình 22.4 và 22.5, các cạnh được dán nhãn để chỉ loại của chúng. Hình 22.5
(c) cũng trình bày cách đồ thị của hình 22.5 (a) có thể vẽ lại để tất cả các cây và
các cạnh trước hướng xuống trong cây chiều sâu, và tất cả các cạnh sau đi lên. Bất
kì đồ thị nào có thể được vẽ lại theo cách làm này.
Thuật toán DFS có thể sửa đổi để phân loại các cạnh khi nó gặp chúng. Ý
tưởng chìa khóa đó là mỗi cạnh (u,v) có thể phân loại bởi màu sắc của đỉnh v mà
Tiểu luận Thiết kế và phân tích thuật toán - Nhóm 4 Trang 25

×