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ộtthuậ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’,
Trang 1CÁ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ìmkiế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ìmkiế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áccá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ácthuậ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ằngdanh 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à ứngdụ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ônluô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ệuvà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ántì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 chorằng dữ liệu vào đồ thị được biểu diễn bởi ma trận kề
Trang 2Hì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 Adjlư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, danhsá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ồmcá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 đặctrư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ễncủ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 trongAdj[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ượclạ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)
Trang 3Cá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ộthàm trọng số w: E R Ví dụ, cho G = (V,E) là một đồ thị có trọng số với hàmtrọ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 vtrong 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ươngpháp nào nhanh hơn để xác định nếu một cạnh đã cho (u,v) có trong đồ thị hơn tìmkiế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 danhsá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ủamột đồ thị G bao gồm một |V| x |V| ma trận A = (aij) 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 Ө(V2)
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
nếu (i,j) E ngược lại
Trang 4cá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ạnhkhô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à 0hoặ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 trongviệ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áytí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 7như 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ị GT = (V , ET),trong đó ET = { (v,u) V x V: (u,v) E} Vì vậy, GT là G với tất cả các cạnh đốinghịch chính nó Mô tả hiệu quả các thuật toán để tính GT từ G, cho cả hai biểudiễ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ộtthuậ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ớitấ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ặplại chính nó sẽ bị xóa đi
22.1-5
Trang 5Ngang hàng (Square) của một đồ thị vô hướng G = (V,E) là đồ thị G2 = (V,
E2) trong đó (u,w) E2 khi va chỉ khi một số v V, thì cả hai (u,v) E và (v,w)
E Nghĩa là, G2 chứa một cạnh giữa u và v, trong khi G chứa một đường đi với haicạnh xác định giữa u và w Mô tả các thuật tóan hiệu quả để tính tóan G2 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ệncủ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 (V2) 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 = (bi j) trong đó
ij
1 1 0
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ầnlượ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):
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
Trang 6a) 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ềurộ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ấtcủ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 ápdụ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 chotừ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 đầutiê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àuxá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ữachú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
Trang 7trong 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 vtrong 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ếmtheo 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ứatrong biến color[u] Các đỉnh đứng trước đỉnh u được chứa trong biến [u] Nếuu=s thì [u]=Nil Khoảng cách từ đỉnh gốc s đến đỉnh u được xác định theo thuậttoá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ếmcủa BFS trên một đồ thị mẫu
Trang 816 [v] u
17 ENQUEUE (Q,v)
18 color[u] BLACK
Trang 9Hì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
Trang 10đượ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 đỉnhmà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 đượcxem 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ếnsau:
Ở 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ặplạ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àuxá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ácdò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ánbằ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ònglặ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òng14) 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 (theodò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ếmtheo chiều sâu có thể thay đổi khác nhau nhưng khoảng các d của đường đi ngắnnhấ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)
Trang 11a.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 theochiề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ạykhi đồ 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ựchiện khi mà chính đỉnh đó đã được lấy ra khỏi Q và đã được duyệt Do đó, từngdanh 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ổngthờ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ủagiả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ếntí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áckhoả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ắnnhấ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
Trang 12Chú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 đượcchạ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ềukiệ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ảncủa quy nạp là tình huống ngay sau khi đỉnh s được đưa vào danh sách Q theodòng 9 của thuật toán BFS
Giả thiết quy nạp là: d[s]=0= (s,s)
đư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ínhxá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ảithuật BFS Bổ đề tiếp theo sẽ chỉ ra rằng sẽ có hai giá trị d phân biệt trong danhsách Q
Trang 13Do đó, d[vr+1]=d[v]=(d[u]+1)<=d[v1]+1
Cũng từ giả thiết quy nạp, ta có:
d[vr]<=d[u]+1
và do đó d[vr]<=d[u]+1=d[v]=d[vr+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 danhsách thì không tăng thêm theo thứ tự thời gian
Trang 14Cho đồ thị G=(V,E) là đồ thị có hướng hoặc vô hướng, giả sử rằng BFS đượcchạy với G và s V Ta có:
* BFS tìm ra mọi đỉnh vV 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 (
Đỉ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, tacó: (s,v)= (s,u)+1
Vì (s,u) < (s,v)
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]+1Mặ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 vV
Trang 15Chú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útcha ( ) 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 = {vV: [v] Nil}U{s}
and E = {( [v],v): vV-{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ắnnhấ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: E V 1 (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
-ra được mỗi đường đi trong sẽ là đường đi ngắn nhấtG
Trang 16Thủ 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ằngBFS đã được chạy và tìm ra cây chứa đường đi ngắn nhất.
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ảithuậ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à đượctí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 chotrướ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, đượctì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 sV, và một bộcác cạnh E E ứng với mỗi đỉnh vV, đườ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 đượcmộ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 đượcsắ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ậtdở” 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
Trang 17đấ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ả danhsách đó.
22.2-7: Kích thước của một cây T được xác định bởi
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ấttrong 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ủamộ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ạnhrờ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áccạ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ốckhá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ấytrong 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ếmtheo 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ìmkiế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ềusâ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
Trang 18thứ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ếmtheo 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 є Gv],v) : v є G],v],v) : v є G) : v],v) : v є G є G π =V v],v) : v є Gà π[v],v) : v є Gv],v) : v є G] ≠ 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 đỉnhliề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 đầutiê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ứ 2khi 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ếtthú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,
Đỉ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
Trang 19Quá 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
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
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
Trang 20Hì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ượtmỗ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 giantì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
Trang 21nế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 trongf[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àonhữ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ữngkế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-7củ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íchtổ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ủaDFS 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ộctí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 1rừ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ủalời gọi đệ quy của DFS-Visit Đó là, u=π[v] nếu và chỉ nếu DFS-Visit(v) được gọisuố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ìmthấy suốt thời gian đỉnh u tô xám
Trang 22Mộ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úclà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ấungoặ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 ulẫ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
Trang 23Hì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.