Các thuật tốn tìm kiếm trên đồ thị

Một phần của tài liệu Bài toán cây bao trùm trên đồ thị và ứng dụng (Trang 31)

Nhiều thuật tốn trên đồ thị đƣợc xây dựng trên cơ sở duyệt (thăm, xét…) tất cả các đỉnh của đồ thị theo thứ tự sao cho mỗi đỉnh đƣợc thăm đúng một lần (khơng trùng lặp và khơng bỏ sĩt). Những thuật tốn nhƣ vậy sẽ đƣợc gọi là các thuật tốn tìm kiếm (Search Algorithms) trên đồ thị. Trong mục này chúng ta sẽ giới thiệu hai thuật tốn tìm kiếm cơ bản trên đồ thị: Đĩ là thuật tốn tìm kiếm theo chiều sâu (Depth First Search) và thuật tốn tìm kiếm theo chiều rộng (Breadth First Search)

a/ Tìm kiếm theo chiều sâu (DFS = Depth First Search).

Ý tƣởng chính của thuật tốn cĩ thể trình bày nhƣ sau. Ta sẽ bắt đầu tìm kiếm từ một đỉnh v0 nào đĩ của đồ thị. Sau đĩ chọn u là một đỉnh tuỳ ý kề với v0 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 xét thì ta sẽ xét đỉnh này (nĩ sẽ trở thành đã xét) và bắt đầu từ nĩ ta sẽ bắt đầu quá trình tìm kiếm cịn nếu nhƣ khơng cịn đỉnh nào kề với v là chƣa xét thì ta nĩi rằng đỉnh này đã 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=v0, thì kết thúc tìm kiếm). Cĩ thể nĩi tìm kiếm theo chiều sâu bắt đầu từ đỉnh v đƣợ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 xét kề với v

Xét đồ thị cho trong hình 2.14 gồm 13 đỉnh, các đỉnh đƣợc đánh số từ 1 đến 13 nhƣ sau:

1(1) 2(2) 3(9) 7(8) 5 (5) 8(6) 9(7) 6(4) 4 (3) 13(10) 12 (11) 10(12) 11(13)

Hình 2.14. Tìm kiếm theo chiều sâu

Chỉ số mới (trong ngoặc) của các đỉnh đƣợc đánh lại theo thứ tự chúng đƣợc thăm trong thuật tốn tìm kiếm theo chiều sâu. Giả thiết rằng các đỉnh trong danh sách kề của đỉnh v (Ke(v)) đƣợc sắp xếp theo thứ tự tăng dần của chỉ số.

Thuật tốn tìm kiếm theo chiều sâu trên đồ thị vơ hƣớng trình bày ở trên dễ dàng cĩ thể mơ tả lại cho đồ thị cĩ hƣớng. Trong trƣờng hợp đồ thị cĩ hƣớng, thủ tục DFS(v) sẽ cho phép thăm tất cả các đỉnh u nào mà từ v cĩ đƣờng đi đến u.

b/ Tìm kiếm theo chiều rộng ( BFS = Breadth first Search ).

Để ý rằng trong thuật tốn tìm kiếm theo chiều sâu đỉnh đƣợc thăm càng muộn sẽ càng sớm trở thành đã duyệt xong. Điều đĩ là hệ quả tất yếu của việc các đỉnh đƣợc thăm sẽ đƣợc kết nạp vào trong ngăn xếp (STACK). Tìm kiếm theo chiều rộng trên đồ thị, nếu nĩi một cách ngắn gọn, đƣợc xây dựng trên cơ sở thay thế ngăn xếp (STACK) bởi hàng đợi (QUEUE). Với sự cải biên nhƣ vậy, đỉnh đƣợc thăm càng sớm sẽ càng sớm trở thành đã duyệt xong (tức là càng sớm dời khỏi hàng

đợi). Một đỉnh sẽ trở thành đã duyệt xong ngay sau khi ta xét xong tất cả các đỉnh kề (chƣa đƣợc thăm) với nĩ.

Xét đồ thị xét trong hình 2.15, thứ tự thăm đỉnh của đồ thị theo thuật tốn tìm kiếm theo chiều rộng đƣợc ghi trong ngoặc.

1(1) 2(2) 3 (11) 7 (6) 5 (9) 8(12) 9(13) 6 (5) 4(3) 13(10) 12 (4) 10(7) 11(8)

Hình 2.15. Tìm kiếm theo chiều rộng 2.3 Đồ thị Euler và đồ thị Hamilton

2.3.1 Đồ thị Euler

Định nghĩa 2.10: Chu trình đơn trong đồ thị G đi qua mỗi cạnh của nĩ một lần được gọi là chu trình Euler. Đường đi đơn trong G đi qua mỗi cạnh của nĩ một lần được gọi là đường đi Euler. Đồ thị được gọi là đồ thị Euler nếu cĩ chu trình Euler và gọi là đồ thị nửa Euler nếu cĩ đường đi Euler.

Rõ ràng mọi đồ thị Euler luơn là nửa Euler, nhƣng điều ngƣợc lại khơng luơn đúng.

Đồ thị G1 Đồ thị G2 Hình 2.16. Đồ thị Euler

Trong hình 2.16 đồ thị G1 là đồ thị Euler vì nĩ cĩ chu trình Euler a, e, c, d, e, b, a. Đồ thị G2 khơng cĩ chu trình Euler nhƣng cĩ đƣờng đi Euler a, c, d, e, b, d, a, b vì thế G2 là đồ thị nửa Euler.

Điều kiện cần và đủ để một đồ thị là một đồ thị Euler đƣợc Euler tìm ra vào năm 1736 khi ơng giải quyết bài tốn bài tốn hĩc búa nổi tiếng thế giới thời đĩ về bảy cái cầu ở thành phố Konigdberg và đây là định lý đầu tiên của lý thuyết đồ thị.

Định lý 2.4 (Euler). Đồ thị vơ hướng liên thơng G là đồ thị Euler khi và chỉ khi mọi đỉnh của G đều là cĩ bậc chẵn.

Để chứng minh định lý trƣớc hết ta chứng minh bổ đề.

Bổ đề 2.1: Nếu bậc của mỗi đỉnh của đồ thị G khơng nhỏ hơn 2 thì G chứa chu trình.

Chứng minh: Nếu G cĩ cạnh lặp thì khẳng định của bổ đề là hiển nhiên. Vì vậy giả sử G là đơn đồ thị. Gọi v là một đỉnh nào đĩ của G. Ta sẽ xây dựng theo qui nạp đƣờng đi. v  v1  v2 … a b e c d a b d e c

Trong đĩ v1 là đỉnh kề với v, do tập đỉnh của G là hữu hạn nên sau một số hữu hạn bƣớc ta phải quay lại đỉnh đã xuất hiện trƣớc đĩ. Gọi đỉnh đầu tiên nhƣ thế là vk. Khi đĩ đoạn của đƣờng đi xây dựng nằm giữa hai đỉnh vk là chu trình cần tìm.

Chứng minh định lý:

Điều kiện cần: Giả sử G là đồ thị Euler tức là tồn tại chu trình Euler P trong G. Khi đĩ cứ mỗi lần chu trình P đi qua một đỉnh nào đĩ của G bậc của đỉnh đĩ tăng lên 2. Mặt khác mỗi cạnh của đồ thị xuất hiện trong P đúng một lần, suy ra mỗi đỉnh của đồ thị đều là bậc chẵn.

Điều kiện đủ: Quy nạp theo số đỉnh và số cạnh của G. Do G liên thơng và m(v) là số chẵn nên bậc của nĩ khơng nhỏ hơn 2. Từ đĩ theo bổ đề 2.1 G phải chứa chu trình C. Nếu C đi qua tất cả các cạnh của G thì nĩ chính là chu trình Euler. Giả sử C khơng đi qua tất cả các cạnh của G, khi đĩ loại bỏ G tất cả các cạnh thuộc C ta thu đƣợc một đồ thị mới H vẫn là bậc chẵn. Theo giả thiết qui nạp, trong mỗi thành phần liên thơng của H đều tìm đƣợc chu trình Euler. Do G là liên thơng nên trong mỗi thành phần của H cĩ ít nhất một đỉnh chung với chu trình C. Vì vậy, ta cĩ thể xây dựng chu trình Euler trong G nhƣ sau: bắt đầu từ một đỉnh nào đĩ của chu trình C, đi theo các cạnh của C chừng nào chƣa gặp phải đỉnh khơng cơ lập của H. Nếu gặp phải đỉnh nhƣ vậy ta sẽ đi theo chu trình Euler của thành phần liên thơng của H chứa đỉnh đĩ. Sau đĩ lại tiếp tục đi theo cạnh của C cho đến khi gặp phải đỉnh khơng cơ lập của H thì lại theo chu trình Euler của thành phần liên thơng tƣơng ứng trong H. Quá trình kết thúc khi ta trở về đỉnh xuất phát, tức là thu đƣợc chu trình đi qua mỗi cạnh của đồ thị đúng một lần.

Hệ quả 2.1: Đồ thị vơ hướng liên thơng G là nửa Euler khi và chỉ khi nĩ khơng quá 2 đỉnh bậc lẻ.

Chứng minh: Thực vây, nếu G cĩ khơng quá 2 đỉnh bậc lẻ thì số đỉnh bậc lẻ của nĩ cĩ thể là 0 hoặc 2. Nếu G khơng cĩ đỉnh bậc lẻ thì theo định lý Euler nĩ là đồ thị Euler. Giả sử G cĩ 2 đỉnh bậc lẻ là u và v. Gọi H là đồ thị thu đƣợc từ G bằng cách thêm vào G một đỉnh mới w và hai cạnh (w, v) và (w, u). Khi đĩ tất cả các

đỉnh của H đều là bậc chẵn, vì thế theo định lý Euler. Ta cĩ chu trình Euler C. Xĩa bỏ khỏi chu trình này đỉnh w và hai cạnh kề với nĩ ta thu đƣợc đƣờng đi Euler trong đồ thị G.

2.3.2 Đồ thị Hamilton

Định nghĩa 2.11: Đường đi qua tất cả các đỉnh của đồ thị mỗi đỉnh đúng một lần được gọi là đường đi Hamilton. Chu trình bắt đầu từ một đỉnh v nào đĩ qua tất cả các đỉnh cịn lại mỗi đỉnh đúng một lần rồi quay trở về v được gọi là chu trình Hamilton. Đồ thị G được gọi là Hamilton nếu nĩ chứa chu trình Hamilton và gọi là đồ thị nửa Hamilton nếu nĩ cĩ đường đi Hamilton.

Đồ thị G1 Đồ thị G2

Hình 2.17. Đồ thị Hamilton

Trong hình 2.17: G1 là nửa Hamilton cịn G2 là Hamilton.

Định lý 2.5: (Dirak 1952) Đơn đồ thị vơ hướng G với n≥2 đỉnh, mỗi đỉnh cĩ bậc khơng nhỏ hơn n/2 là đồ thị Hamilton.

Chứng minh: Thêm vào đồ thị G k đỉnh mới và nối chúng với tất cả các đỉnh của G. Giả sử k là số nhỏ nhất cần thêm vào để cho đồ thị thu đƣợc G‟ là đồ thị Hamilton. Ta sẽ chỉ ra rằng k=0.

Thực vậy, giả sử ngƣợc lại là k>0. Ký hiệu v, p, w, …, v. là chu trình Hamilton trong G‟, trong đĩ v,w là đỉnh của G cịn P là một trong số các đỉnh mới.

a b c d a b d c

Khi đĩ w khơng kề với v vì nếu ngƣợc lại ta khơng cần sử dụng p và điều đĩ là mâu thuẫn với giả thiết k nhỏ nhất. Hơn nữa đỉnh (w‟ chẳng hạn) kề với w khơng thể đi liền sau đỉnh v‟ (kề với v) vì rằng khi đĩ cĩ thể thay.

v  p w …. v’ w‟… v bởi v  v‟….  w  w‟ … v

Bằng cách đảo ngƣợc đoạn chu trình nằm trong w và v‟. Từ đĩ suy ra là số đỉnh của đồ thị G‟ khơng kề với w là khơng nhỏ hơn số đỉnh kề với v (tức là ít nhất cũng là bằng n/2+k), đồng thời số đỉnh của G‟ kề với w ít ra là phải bằng n/2+k. Do khơng cĩ đỉnh nào của G‟ vừa khơng kề, lại vừa kề với w, cho nên tổng số đỉnh của đồ thị G‟ (G‟ cĩ n+k đỉnh) khơng ít hơn n+2k. Mâu thuẫn do đĩ đã chứng minh đƣợc định lý.

2.4 Cây và cây bao trùm của đồ thị

Đồ thị vơ hƣớng liên thơng khơng cĩ chu trình gọi là cây. Khái niệm cây lần đầu tiên đƣợc Cayley đƣa ra vào 1857, khi ơng sử dụng chúng để đếm một dạng cấu trúc phân tử của các hợp chất hĩa học trong hĩa học hữu cơ. Cây cịn đƣợc sử dụng rộng rãi trong rất nhiều lĩnh vực khác nhau, đặc biệt trong tin học, cây đƣợc sử dụng để xây dựng các thuật tốn tổ chức các thƣ mục, các thuật tốn cất giữ, truyền dữ liệu và tìm kiếm.

Định nghĩa 2.12: Ta gọi cây là một đồ thị vơ hướng liên thơng và khơng cĩ chu trình. Đồ thị vơ hướng gồm k thành phần liên thơng mà mỗi thành phần liên thơng là một cây được gọi là rừng.

T1 T2 Hình 2.18. Cây của đồ thị

Trong hình 2.18 là một rừng gồm 2 cây T1, T2.

Cĩ thể nĩi cây là đồ thị vơ hƣớng đơn giản nhất. Định lý sau đây cho ta một số tính chất của cây.

Định lý 2.6: Giả sử G = (V, E) là đồ thì vơ hướng n đỉnh. Khi đĩ các mệnh đề sau đây là tương đương:

1) T là cây.

2) T khơng chứa chu trình và cĩ n-1 cạnh. 3) T liên thơng và cĩ n-1 cạnh .

4) T liên thơng và mỗi cạnh của nĩ đều là cầu.

5) Hai đỉnh bất kỳ của T đƣợc nối với nhau bởi đúng một đƣờng đi đơn. 6) T khơng chứa chu trình nhƣng hễ cứ thêm vào một cạnh ta thu đƣợc

một chu trình.

Chứng minh: ta sẽ chứng minh định lý theo sơ đồ sau: (1)=>(2)=>(3)=>(4)=>(5)=>(6)=>(1)

(1)=>(2) theo định nghĩa T khơng chứa chu trình. Ta sẽ chứng minh bằng qui nạp theo số đỉnh n cho khẳng định: Số cạnh của cây với n đỉnh là n -1. Rõ ràng khẳng định đúng với n = 1. Giả sử n > 1. Trƣớc hết nhận rằng trong mọi cây T cĩ n

a b c d a b d c d

đỉnh đều tìm đƣợc ít nhất một đỉnh là đỉnh treo (tức là đỉnh cĩ bậc là 1). Thực vậy, gọi v1,v2,…,vk là đƣờng đi dài nhất (theo số cạnh) trong T. Khi đĩ rõ ràng v1 và vk là các đỉnh treo, vì từ v1(vk) khơng cĩ cạnh nối với bất cứ đỉnh nào trong số các đỉnh v2,v3,…,vk (do đồ thị khơng chứachu trình), cũng nhƣ với bất cứ đỉnh nào khác của đồ thị (do đƣờng đi đang xét dài nhất). Loại bỏ v1 và cạnh (v1,v2) khỏi T ta thu đƣợc cây T1 với n-1 đỉnh, mà theo giả thiết qui nạp cĩ n-2 cạnh. Vậy cây T cĩ n-2+1=n-1 cạnh.

(2) => (3) ta chứng minh bằng phản chứng. Giả sử T khơng liên thơng. Khi đĩ T phân rã thành k ≥ 2 phần liên thơng T1,T2,…,Tk. Do T khơng chứa chu trình nên mỗi Ti (i=1,2,..,k) cũng khơng chứa chu trình, vì thế mỗi Ti là cây. Do đĩ nếu gọi n(Ti) và e(Ti) theo thứ tự là số đỉnh và cạnh của Ti, ta cĩ:

e(Ti) = n(Ti)-1, i =1,2,3,…,k suy ra

n-1 = e(T) = e(T1) +…+ e(Tk) = n(T1) +…+ n(Tk)-k

= n(T) - k < n-1

Mâu thuẫn thu đƣợc chứng tỏ là T liên thơng.

(3)=>(4) Việc loại bỏ một cạnh bất kỳ khỏi T dẫn đến đồ thị với n đỉnh và n-2 cạnh rõ ràng là đồ thì khơng liên thơng.vậy mọi cãnh trong T đều là cầu.

(4)=>(5) Do T là liên thơng nên hai đỉnh bất kỳ của nĩ đƣợc nối với nhau bởi một đƣờng đi đơn. Nếu cĩ cặp đỉnh nào của T cĩ hai đƣờng đi đơn khác nhau nối chúng, thì từ đĩ suy ra đồ thị chứa chu trình, và vì thế các cạnh trên chu trình này khơng phải là cầu.

(5)=>(6) T khơng chứa chu trình, bởi vì thế nếu cĩ chu trình thì hĩa ra tìm đƣợc cặp đỉnh của T đƣợc nối với nhau bởi hai đƣờng đi đơn. Bây giờ, nếu thêm vào T một cạnh e nối hai đỉnh u và v nào đĩ của T. Khi đĩ cạnh này cùng với đƣờng

đi đơn nối u và v sẽ tạo thành chu trình trong T. Chu trình thu đƣợc này là duy nhất, vì thế thu đƣợc nhiều hơn một chu trình thì suy ra trong T trƣớc đĩ phải cĩ sãn chu trình.

(6)=>(1) Giả sử T khơng liên thơng. Khi đĩ gồm ít ra là thành phần liên thơng. Vì vậy, nếu thêm vào T cạnh nối hai đỉnh thuộc hai thành phần liên thơng khác nhau ta khơng thu đƣợc thêm một chu trình nào cả. Điều đĩ mâu thuẫn với giả thiết (6) định lý đƣợc chứng minh.

Tĩm lại. Chƣơng này đã đề cập tới những khái niệm về đồ thị cĩ liên quan đến bài tốn cây bao trùm nhỏ nhất đƣợc xét ở các chƣơng sau. Cụ thể, đã trình bày và giải thích các khái niệm về đồ thị (vơ hƣớng, cĩ hƣớng), đỉnh và cạnh (cung), đƣờng và chu trình trong đồ thị, chu trình Euler, chu trình Hamilton.

Chƣơng 3. BÀI TỐN CÂY BAO TRÙM NHỎ NHẤT

Chƣơng này đề cập tới bài tốn cây bao trùm nhỏ nhất, một bài tốn cơ bản cĩ vai trị trung tâm trong lý thuyết tối ƣu tổ hợp và cĩ nhiều ứng dụng thiết thực trong thực tiễn, đặc biệt trong các vấn đề về thiết kế mạng. Chúng tơi sẽ giới thiệu bài tốn và một số ứng dụng trực tiếp của nĩ, sau đĩ sẽ trình bày ba thuật tốn nổi tốn nổi tiếng giải bài tốn và cuối cùng đề cập tới bài tốn ngƣời du lịch dựa vào bài tốn cây bao trùm nhỏ nhất. Nội dung trình bày ở chƣơng bày ở chƣơng này dựa chủ yếu trên các tài liệu [2], [4] và [8].

3.1 Nội dung và ý nghĩa bài tốn 3.1.1 Nội dung bài tốn 3.1.1 Nội dung bài tốn

Bài tốn cây bao trùm nhỏ nhất của đồ thị là một trong số những bài tốn tối ƣu trên đồ thị tìm đƣợc ứng dụng nhiều lĩnh vực khác nhau của đời sống. Trong mục này chúng ta trình bày những thuật tốn cơ bản để giải bài tốn nào. Trƣớc hết chúng ta phát biểu nội dung bài tốn.

Cho G=(V,E) là đồ thị vơ hƣớng liên thơng với tập đỉnh V={1,2,..,n} và tập cạnh E gồm m cạnh. Mỗi cạnh E của đồ thị G đƣợc gán với một số khơng âm c(e), gọi là độ dài của nĩ. Giả sử H=(V,T) là cây bao trùm của đồ thị G. Ta gọi độ dài c(H) của cây bao trùm H là tổng độ dài các cạnh của nĩ.

Bài tốn đặt ra là trong tất cả cây bao trùm của đồ thị G hãy tìm cây bao trùm với độ dài nhỏ nhất. Cây bao trùm nhƣ vậy đƣợc gọi là cây bao trùm nhỏ nhất của

Một phần của tài liệu Bài toán cây bao trùm trên đồ thị và ứng dụng (Trang 31)