LỜI MỞ Đầu
Trong nhiều tình huống, do thĩi quen người ta thường vẽ lên giấy những điểm biểu thị cho các cá thể, khu dân cư, các đơn vị hành chính, các nút giao thơng, các hố chất .và nối các điểm đĩ với nhau bằng những nét hoặc những mũi tên tượng trưng cho một mối liên hệ nào đĩ Các sơ đồ này dùng ở khắp mọi
nơi với các tên gọi khác nhau.Trong tâm lí học gọi nĩ là xã hội đồ Trong kinh
tế gọi là sơ đồ tổ chức Trong giao thơng vận tải gọi là mạng giao thơng Chính D.Konig là người đầu tiên đề nghị gọi các sơ đồ như trên là “đồ thị”, đồng thời đề nghị nghiên cứu một cách cĩ hệ thống các tính chất của nĩ
Một điều rất đáng quan tâm là nhiều nghành khoa học hồn tồn khác nhau
lại dùng những định lí giống nhau; chẳng hạn, khái niệm ” ma trận liên thuộc”, do G.R.Kirchhoof đưa ra để nghiên cứu mạch điện, song đã được Henri Poincare dùng lại trong tơpơ học để xây dựng ”analysis sictus” của nĩ Khái
niệm “điểm khớp” đã xuất hiện từ lâu trong xã hội học, đến gần đây lại xuất hiện trong ngành điện tử Những thí dụ như trên nhiều vơ kể Điều này chứng tỏ lí thuyết đồ thị được hình thành từ thực tế nĩ rất cĩ nhiều ứng dụng trong xã hội
Vì vậy tác giả đã chọn lý thuyết đồ thị để làm đề tài tốt nghiệp cuối khố Khố luận của tác giả gồm hai phần:
Phần I: Lý thuyết
Phần này trên cơ sở của tài liệu [1] và [2] tác giả trình bày các khái niệm và
định lý cơ bản trong các bài sau đây: §1 Các khái niệm cơ bản
§ 2 Xích, chu trình và đồ thị liên thơng
§ 3 Hàm GRANDI, chu số và cây § 4 Các tập hợp trên đồ thị
§5 Đồ thị EULER và đồ thị HAMILTON
Trang 2Phần II: Các giải thuật của các bài tốn cơ bản về lý thuyết đồ thị trên ngơn
ngữ lập trình Pascal
Phần này trên cơ sở của tài liệu [2] tác giả trình bày mười bốn thuật tốn và
các chương trình viết bằng ngơn ngữ Pascal kèm theo
Để hồn thành khố luận này tơi đã tham khảo nhiều tài liệu khác nhau và nhận được nhiều ý kiến đĩng gĩp của các thầy cơ giáo đặc biệt là sự hướng dẫn tận tình, chu đáo của thầy giáo hướng dẫn khoa học Nhân dịp này tơi xin bày tỏ lời cảm ơn chân thành tới thây giáo Trần Văn Hữu và cùng tồn thể các thây cơ đã tận tình giúp đỡ
Mặc dù đã cố gắng nhiều nhưng do trình độ cịn hạn chế khố luận này khơng tránh khỏi những hạn chế, thiếu sĩt Rất mong nhận được sự gĩp ý chân thành
và được lượng thứ
Trang 3PHAN I: LY THUYET
§1 CAC KHAI NIEM CO BAN 1.1 Định nghiã đơ thị
Tập hợp X # Ø các đối tượng và bộ E các cặp sắp thứ tự và khơng sắp thứ tự các phần tử của X được gọi là một đồ thị, đồng thời được kí hiệu bằng G(X,E) hoặc bằng G = (X,E) hay là G(X) Các phần tử của X được gọi là các đỉnh Cặp đỉnh khơng sắp thứ tự được gọi là cạnh Cặp đỉnh sắp thứ tự được gọi là
cạnh cĩ hướng hay cung
Đồ thị chỉ chứa các cạnh được gọi là đồ thị vơ hướng, cịn đồ thị chỉ chứa các cung gọi là đồ thị cĩ hướng Nếu đồ thị chứa cả cạnh lẫn cung thì nĩ được gọi là đồ thị hỗn hợp
Một cặp đỉnh cĩ thể được nối với nhau bằng hai hay nhiều hơn hai cạnh (hai hoặc nhiều hơn hai cung cùng một hướng) Các cạnh hay cung này được gọi là các cạnh hay cung bội
Một cung hay một cạnh cĩ thể bắt đầu và kết thúc tại cùng một đỉnh Cung hay cạnh loại này được gọi là khuyên hay nút
Cặp đỉnh x, y được nối với nhau bằng cạnh hay cung a, thi x,y được gọi là các đỉnh hay hai đầu của cạnh hay cung a và a được gọi là cạnh hay cung thuộc đỉnh x, đỉnh y
Nếu cung b xuất phát từ đỉnh u và đi vào đỉnh v thì u được gọi là đỉnh đầu, cịn v được gọi là đỉnh cuối của cung b
Cặp đỉnh x,y được gọi là hai đỉnh kề nhau nếu xzy và là hai đầu của cùng
một cạnh hay một cung
Hai cạnh hay cung a,b được gọi là kề nhau, nếu: 1) Chúng khác nhau
1i) Chúng cĩ đỉnh chung (nếu a, b là cung, thì khơng phụ thuộcvào đỉnh chung đĩ là đỉnh đầu hay đỉnh cuối của cung a, đỉnh đầu hay đỉnh cuối của
cung b)
Trang 4XE[{XI, X;, Xạ, Xạ, Xs, Xĩ, X;}, Tap cạnh và cung: E={X), X23 Xp, X35 X4, Xo 3X5, X6; X3, X3; XỊ, X6 ; Xs, Xs } ={ a 3 4 ay as bị bạ }, Trong đĩ a,, a;, a; ,a,, as là các cạnh; bạ, by là các cung, cung b, cĩ x; là đỉnh đầu, x„ là đỉnh cuối 1.2 Một số dạng đơ thị đặc biệt
Trong những trường hợp khơng cần phân biệt giữa cạnh và cung ta quy ước
dùng cạnh thay cho cả cung Đồ thi G(X,E) khơng cĩ nút và một cặp đỉnh được nối với nhau bằng khơng quá một canh Được gọi là đồ thị đơn hay đơn đồ thị và thơng thường được gọi là đồ thị
Đồ thị G (X, E) khơng cĩ nút và cĩ ít nhất một cặp đỉnh được nối với nhau
bằng từ hai cạnh trở lên được gọi là đa đồ thị
Đồ thị (đa đồ thị) G (X, E) được gọi là đồ thị đầy đủ nếu mỗi cặp đỉnh được nối với nhau bằng đúng một cạnh (một cung với chiều tuỳ ý)
Đa đồ thị vơ hướng (cĩ hướng) G(X,E) được gọi là đồ thị k- đầy đủ, nếu mỗi cặp đỉnh được nối với nhau bằng đúng k cạnh (k cung với chiều tuỳ ý)
Đồ thị (đa đồ thị) G(X,E) được gọi là đồ thị (đa đồ thị) hai mảng nếu tập đỉnh X của nĩ được phân thành hai tập con rời nhau X,,X; (X, U X;=X và
X,đnX;, z Ø) và mỗi cạnh đều cĩ một đầu thuộc X, cịn đầu kia thuộc X,
Trang 5Đồ thị (đa đồ thị) GŒX,E) được gọi là đồ thị (đa đồ thị) phẳng, nếu cĩ ít
nhất một dạng biểu diễn hình học trải trên một mặt phẳng nào đĩ mà các
cạnh của đồ thị chỉ cắt nhau ở đỉnh
D6 thi (da d6 thi) G(X,E) được gọi là hữu hạn nếu số đỉnh của nĩ là hữu
hạn Tức tập X cĩ lực lượng hữu hạn
Đồ thị (đa đồ thị) với tập đỉnh vơ hạn được gọi là Đồ thị (đa đồ thị) vơ hạn Đồ thị (đa đồ thị) với số cạnh thuộc mỗi đỉnh đều hữu hạn được gọi là Đồ thị (đa đồ thị) hữu hạn địa phương
Hiển nhiên rằng, một đồ thị hay đa đồ thị hữu hạn, thì nĩ cũng hữu hạn địa phương Trong các phần tiếp theo, nếu khơng cĩ chú ý gì thêm, thì các đồ thị, đa đồ thị được xét đều hữu hạn
Cho YcX, Y#0; HCE,F=EN(YxY) va V= (XxX) /E
Đồ thị G,(Y,F) được gọi là đồ thị con, cịn G,(X,H) là đồ thị bộ phận của đồ
thi G(X, E)
Đồ thị G’(X,V) được gọi là đồ thị bù của đồ thị G (X, E)
1.3 Biểu diễn đồ thị
1.3.1 Định nghĩa
Ma trận vuơng M(n, n) chỉ gồm các phần tử 0,1 gọi là ma trận kề của đồ thị
Trang 6Giả sử đồ thị cĩ n đỉnh Khi đĩ tồn tại đường đi từ đỉnh a đến đỉnh b khi và chỉ khi tồn tại đường đi từ đỉnh a đến đỉnh b với độ dài < n -I
§2_XÍCH, CHU TRINH VA DO THI LIEN THONG
Đối với đồ thị (đa đồ thị) vơ hướng cĩ khái niệm xích (dây chuyền) và chu trình, cịn đối với đồ thị (đa đồ thị) cĩ hướng tồn tại khái niệm đường và vịng Tuy vậy, người ta vẫn dùng khái niệm đường cho cả đồ thị và đa đồ thị vơ hướng
2.1 Xích, Chu trình
Giả sử G(X, E) là một đồ thị hay đa đồ thị vơ hướng
Dấy (œ) các đỉnh của G(X,E): (œ)=[X,X;_ „X;X;¡; X„¡.X„]
được gọi là một xích hay một dây chuyền, nếu V ¡(1<¡ <n-1) cặp đỉnh x,„x,, kề nhau Tổng số vị trí của tất cả các cạnh xuất hiện trong xích (œ), được gọi là độ dài của xích œ và được ký hiệu bằng /œ /
Các đỉnh xạ và x„ được gọi là hai đỉnh đầu của xích (ơ) Ngồi ra cịn nĩi rằng xích œ nối giữa các đỉnh x, và x„ Dé chỉ rõ đỉnh đầu và đỉnh cuối ta cịn ký hiệu œ bằng œ[x,„x,]
Một xích với hai đầu trùng nhau được gọi là một chu trình
Xích (chu trình) œ được gọi là xích (chu trình) đơn (sơ cấp hay cơ bản), nếu
nĩ đi qua mỗi cạnh (mỗi đỉnh) khơng quá một lần 2.2 Định nghĩa
Đối với đồ thị vơ hướng cĩ khái niệm liên thơng cịn đối với đồ thị cĩ hướng
đưa ra khái niệm liên thơng mạnh
Hai đỉnh x, y được gọi là hai đỉnh liên thơng nêu hoặc giữa x và y cĩ ít nhất một xích nối với nhau, hoặc tồn tại ít nhất một đường đi từ x sang y hoặc từ y sang X
Đồ thị vơ hương G (X, E) được gọi là đồ thị liên thơng nếu mọi cặp đỉnh của nĩ đều liên thơng
Trang 7Giả sử a là đỉnh bất kỳ thuộc đồ thị G, dùng Ca để ký hiệu tập con các đỉnh của G, gồm đỉnh a và tất cả các đỉnh liên thơng với a trong đồ thị G
Đồ thị con của G cĩ tập đỉnh là Ca được gọi là một thành phần liên thơng của đồ thị G
Đỉnh x trong đồ thị liên thơng G được gọi là điểm khớp, nếu đồ thị con G, nhận được từ G bằng cách bỏ đỉnh x là đồ thị khơng liên thơng Điểm khớp x mà nĩ được nối với một thành phần liên thơng của G, bằng đúng một cạnh, được gọi là điểm khớp đơn
Ví dụ: Cho đồ thị G cĩ 4 thành phần liên thơng
Các đồ thị con G, G; G, liên thơng, đồ thị con G, liên thơng mạnh ° Oo) a Le OW G2 G, G, 2.3 Một vài tính chất Ta gọi bậc của một đỉnh là số cung kề với đỉnh đĩ 2.3.1 Định lý
Ký hiệu S () là bậc của đỉnh ¡, m là số cung của đồ thị Khi đĩ tổng của SŒ)
Trang 82.3.5 Định lý G liên thơng khi và chỉ khi số thành phần liên thơng của nĩ bằng 1 2.3.6 Hệ quả Nếu G cĩ n đỉnh và số cung > (n-1) (n-2) / 2 thì G liên thơng 2.3.7 Hệ quả
Trong đồ thị liên thơng mạnh m = n — 1 khi và chỉ khi nĩ khơng cĩ chu trình §3 HAM GRANDI, CHU SO VA SAC SO: 3.1 HAM GRANDI 3.1.1 Dinh nghia Ký hiéu s6 nguyén khéng 4m 1a N={0,1,2, .} Ham g: A > N được gọi là hàm Grandi của đồ thị G = ( A,F ) nếu VxeA: g(x) = min{N\g( F(x) )}
Tw dinh nghia suy ra 2 tinh chat dac trung cua ham Grandi a) Vx,yeA, nếu yeF(x) thi g(x) # g(y)
b)Vu < g(x), uEN
3.1.2 Nhan xét
+Đồ thị cĩ đỉnh nút khơng thể cĩ hàm Grandi +Néu F(x) tréng thi g(x)=0
+Néu x ké y thi g(x) #g(y)
+g(x) <| F(x) | (ky hiệu | | là số phần tử của tap hợp)
3.1.3 Định lý
Nếu G khơng cĩ chu trình thì tồn tại duy nhất một hàm Grandi 3.1.4 Định nghĩa
Với u, v eN ta biểu diển các số đĩ dưới dạng nhị phân Ug, Ug, ves Uy, Up Ves Vite «+9 Vis Vo
Cĩ thể xem độ dài khai triển của hai số bằng nhau (nếu khơng thì thêm số 0
vào phía trước)
Trang 9Số w cĩ khai triển nhị phân là w,, w,¡, , w¡, wạ gọi là d- tổng của v và u
ký hiệu là : v@u
* Nhận xét:
+ d- tổng cĩ tính giao hốn, kết hợp
+ v@u =0 < v=u
* Khái niêm về tổng hai đồ thị
Cho hai dé thi G,(A,,F,) va G,(A,,F,)
Đồ thị G(A,F) được gọi là tổng của G, và G,, ký hiệu G,+G, trong đĩ A =AxA; ( tích đề các )
(x,y)eF((a,b)) © x = a và yeF;(b) hoặc xeF;(a) và y = b
3.1.5 Định lý
Néu g, la ham Grandi cla G,, g, 1a ham Grandi cua G,
thì g(x,y)=g,(x) @g,(y) la ham Grandi cua dé thi tng ~G=G,+G, 3.2 Chu số
3.2.1 Định nghĩa
Trang 10Ta nĩi rằng đồ thị G tơ được k màu nếu tồn tại hàm f:A—>{0,1, ,k-1} sao cho nếu hai đỉnh x,y kề nhau thì f (x) # £ (y)
3.3.2 Định nghĩa
Số k gọi là sắc số của đồ thị G nếu :
a)G tơ được k màu
b)G khơng tơ được k-I màu 3.3.3 Định lý
Giả sử G cĩ ít nhất một cung G cĩ sắc số bằng 2 khi và chỉ khi G khơng cĩ chu trình vơ hướng độ dài lẻ
3.3.4 Định lý
G tơ được k màu khi và chỉ khi tồn tai ham Grandi g<k-1
3.3.5 Định lý
Giả sử đồ thị G tơ được k+1 màu, đồ thị H tơ được k+lI màu Khi đĩ đồ thị tổng G+H tơ được r+1 màu,trong đĩ r= max{k’@q’| k’<k, q’ <q} 3.3.6 Định lý Nếu mỗi đỉnh của G cĩ bậc <r thì sắc số của G< r+1 3.3.7 Định lý Nếu G cĩ n đỉnh thì: n< s(G).s(G) và s(G)+s(G,) < n+1, trong đĩ s ký hiệu sắc số của đồ thị §4 CÁC TẬP HỢP TRÊN ĐỒ THỊ 4.1 Tập ổn định trong 4.1.1 Định nghĩa
Cho đồ thị G (A, F) Tập BC A gọi là ổn định trong của G
nếu V x € B: BO F(x)=$ Nghia la trong B khơng cĩ hai đỉnh kề nhau Cĩ thể xem tập rỗng là tập ổn định trong
Trang 114.1.2 Định nghĩa Đồ thị G'(A,F') được gọi là đồ thị bù của đồ thị G(A,F) nếu V x,y e A, yeF(x)c©y øe F() Tập B được gọi là ổn định trong cực đại nếu thêm bất cứ đỉnh nào cũng mất tính ổn định trong 4.1.3 Định lý Nếu mỗi đỉnh của G đều cĩ bậc < r, n là số đỉnh thì mỗi tập ổn định trong cực đại sẽ cĩ số phần tử > n / (r+1) 4.1.4 Định lý Nếu G cĩ n đỉnh và sắc số s thì tập ổn định trong lớn nhất của G sẽ cĩ sơ phần tử k > n/ s 4.1.5 Số ổn định trong
Dùng H (G) để ký hiệu họ gồm tất cả các cặp ổn định trong của đồ thị G Định nghĩa: Số phần tử của một trong những tập ổn định trong cĩ lực lượng lớn nhất được gọi là số ổn định trong của đồ thị G, đồng thời được ký hiệu
bằng œ (G), nghĩa là: ơ (G)= max {|A|/A e H(G) }
Chú ý: Đối với khái niệm ổn định trong, người ta quan niệm trước hết đến
các tập ổn định trong cĩ lực lượng cực đại, tức những tập ổn định trong cĩ số
phần tử bằng số ổn định trong của đồ thị
Ví dụ (Gauss): Bài tốn cĩ 8 con hậu chính là một trường hợp của bài tốn: Trên bàn cờnxn cĩ thể đặt tối đa bao nhiêu con hậu ( tương tự xe, mã, tượng) để chúng khơng ăn lẫn nhau? Cĩ bao nhiêu cách đặt?
Khi n = 8 số đồ thị G, cĩ số ổn định trong bằng 8 nên chỉ cĩ thể đặt tốiđa 8
con hậu trên bàn cờ 8 x 8, thì chúng khơng thể ăn lẫn nhau
Cịn về cách đặt lúc đâu Gauss cho rằng cĩ 76 cách Năm 1954 tờ báo về cờ ở Béclin “Schaczeitung” đưa ra 40 cách, nhưng trên thực tế đồ thị G, cĩ 92 tập
ổn định trong lực lượng bằng 8, nên cĩ tất cả 92 cách đặt 8 con hậu trên bàn
Trang 12(72631485) (61528374) (58417263) (35841726) (46152837) (57263148) (16837425) (57263184) (48157236) (51468273) (42751863) (35281746) 72631485
Mỗi sơ đồ như trên tương ứng với một hốn vị và từ mỗi sơ đồ ta suy ra 8 cách đặt khác nhau: 3 cách đặt bằng cách quay 900, 1800, 270 Các lời giải khác suy được bằng cách đối xứng mỗi sơ đồ nhận được qua đường chéo chính Hốn vị cuối cùng chỉ cho 4 lời giải vì sơ đồ tương ứng sẽ trùng với chính nĩ sau khi quay 180°
4.2 Tap 6n dinh ngoai
4.2.1 Dinh nghia:
Cho đồ thị G( A,F ).Tap BCA goi là ổn định ngồi cia G néu: Vx¢B:
BOF(x) # 6, néi cach khac V x ¢B: 5 y €B sao cho ye F(x)
Hién nhién néu tap B 6n dinh ngoai thi B’ > B cũng ổn định ngồi 4.2.2 Số ổn định ngồi:
Dùng P (G) để ký hiệu họ gồm tất cả các cặp ổn định ngồi của đồ thị G Định nghĩa: Số phần tử của một trong những tập ổn định ngồi cĩ lực lượng bé nhất được gọi là số ổn định ngồi của đồ thị G, đồng thời đượcký hiệu
bằng B (G), nghĩa là: B (G)= min {| Al/A € PG) }
Trang 13Ví dụ: Bài tốn về 5 con hậu chính là trường hợp của bài tốn:
Trên bàn cờ n x n cĩ thể đặt tối đa bao nhiêu con hậu tương tự xe, mã, tượng,
để chúng khống chế được tất cả các ơ cịn lại trên bàn cờ? Cĩ bao nhiêu cách dat?
Khi n = 8 dé thi G,, c6 s6 6n dinh ngoai B = 5, nén chi can 5 con hau b6 tri trên các ơ tương ứng với một tập ổn định ngồi thì chúng sẽ khống chế được tất cả các ơ trên bàn cờ
Khi n= 8 đồ thị Gụ cĩ số ổn định ngồi B = 12, nên chỉ cần 12 con mã bố trí trên các ơ tương ứng với một tập ổn định ngồi thì chúng sẽ khống chế được tất cả các ơ trên bàn cờ
Khi n = 8 đồ thị G; cĩ số ổn định ngồi B = 8, nên chỉ cần 8 con tượng bố trí trên các ơ tương ứng với một tập ổn định ngồi thì chúng sẽ khống chế được tất cả các ơ trên bàn cờ
Khi n = 8 đồ thị Gv cĩ số ổn định ngồi B = 8, nên chỉ cần 8 con xe bố trí trên các ơ nằm trên đường chéo thì chúng sẽ khống chế được tất cả các ơ trên bàn cờ 4.3 Nhân 4.3.1 Dinh nghia Tap B c A goi 1a nhan cua d6 thi néu B vita 6n dinh trong vira 6n định ngồi, nghĩa là: Vx € B: BO F(x) =6 Vx € B:BO F(x) #0 * Hai điều kiện trên của nhân tương đương với: F'(B)=AXB Từ định nghĩa suy ra :
¡) Nhân khơng chứa đỉnh nút
Trang 14* Chú ý: Nêú g là hàm Grandi của đồ thị G thì tâp B={x\ g(x) = 0} là một nhân của G 4.3.2 Định lý Nếu Blà nhân của G thì B củng là tập ổn định trong cực đại 4.3.3 Định lý Trong đồ thị vơ hướng khơng cĩ nút mọi tâp ổn định trong cực đại đều là nhân của đồ thị 4.3.4 Hệ quả Mọi đồ thị vơ hướng khơng cĩ nút luơn cĩ nhân 4.3.5 Định lý Mọi đồ thị khơng cĩ chu luơn cĩ nhân 4.3.6 Định lý Mọi đồ thị khơng cĩ chu trình độ dài lẻ luơn cĩ nhân 4.3.7 Bổ đề Mọi đồ thị G đều cĩ cơ sở 4.3.8 Định lý Nếu mỗi đồ thị con của G điều cĩ nhân thì G cĩ hàm Grandi 4.3.9 Hệ quả Đồ thị vơ hướng cĩ hàm Grandi khi và chỉ khi khơng cĩ đỉnh nút §5 ĐỒ THỊ EULER VÀ ĐỒ THỊ HAMILTON 5.1 Đơ thị Euler 5.1.1 Đỉnh nghĩa
Chu trình đơn trong G di qua mỗi cạnh 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 nĩ cĩ chu trình Euler và gọi là đồ thị nửa Euler nêu nĩ cĩ đường đi Euler
5.1.2 Dinh ly (Euler)
Trang 155.1.3 Bổ đề 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 5.1.4 Hệ quả Đồ thị vơ hướng liên thơng G là nửa Euler khi và chỉ khi nĩ cĩ khơng quá hai đỉnh bậc lẻ 5.1.5.Dinh ly.(Dirak 1952)
Da đồ thị liên hợp cĩ chu trình Euler khi và chỉ khi tại mỗi đỉnh a số
Trang 165.2 Đơ thị Hamilton
5.2.1 Định nghĩa
Đường đi qua tất 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 chu trình Hamilton
Đồ thị G được gọi là đồ thị Hamilton nếu nĩ chứa chu trình Hamilton và gọi là
nửa Hamilton nếu nĩ chứa đường đi Hamilton 5.2.2 Dinh ly (Dirak)
Đơ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
§6 CÁC PHƯƠNG PHÁP TÌM KIẾM 6.1 Bài tốn tìm kiếm
Bài tốn tìm kiếm cĩ thể phát biểu vắn tắt như sau:
- Cho một tập hợp S, mỗi phần tử s e S gọi là một trạng thái
- Với mỗi trạng thái se S_ xác định một tập cuss (s) gọi là tập kế thừa của s - Tại mỗi thời điểm cĩ thể đi từ trạng thái s e S đến một trong các trạng
trang thai thudc cuss (s)
- Một phần tử sạ e S gọi là trạng thái xuất phát - Một trạng thái q € S gọi là đích
Từ trạng thái xuất phát sạ hãy tìm cách đi đến đích 6.2 Thuật tốn fìm kiếm
Trang 17Dua hết trạng thái của cuss (s) vào DS Hết vịng lặp
Thơng báo khơng tìm thấy đích (tức là khi DS = ®)
6.3 Tìm kiếm theo chiều sâu
Nếu trong thuật tốn tìm kiếm nĩi trên danh sách DS tổ chức theo kiểu LIFO thì ta cĩ phương pháp tìm kiếm theo chiều sâu trước
Trong phương pháp này mỗi lần duyệt đến tận cùng mỗi nhánh rồi mới sang nhánh khác
6.4 Tìm kiếm theo chiều rộng
Nếu trong thuật tốn tìm kiếm nĩi trên danh sách DS tổ chức theo kiểu FIFO thì ta cĩ phương pháp tìm kiếm theo chiều rộng trước
Trang 18PHẦN 2: CÁC GIẢI THUẬT CỦA MỘT SỐ BÀI TỐN CƠ BẢN TRÊN ĐỒ THỊ
Viết bằng ngơn ngữ lập trình Pascal PROGRAM chuong_ trinh do_ thi uses crt,graph; type cung=record dau, cuoi, dai:integer; end;
mangs= array[0 1000] of string[30];
mangint= array[0 1000]of integer; var dinh:mangs;sd:integer; dau, cuoi,v:mangint; mtke:mangint; sc:integer; r,x0,y0,1:integer;chon:char; { sd : so dinh, sc : so cung}
Bài tốn 1 Nháp đồ thị theo danh sách cung vào một tệp văn bản
Tên các đỉnh là xâu ký tự, mơi đỉnh ghỉ trên một dịng của tệp Thuật tốn Dùng các tệp kiểu TEXT Dùng hàm LAPTEPQ Đọc xâu w chừng nào xâu w cịn khác ký tự / thì cịn đưa w vào tệp (đỉnh đầu của cung) đọc tiếp w
đưa w vào tệp (đỉnh cuối của cung)
Trang 19write('cung ',i,':'"); write('dau: `); Readln(s); while s<>'/' do begin writeln(f,s); write('cuoi: '); readln(s); writeln(f,s); i:=itl; write('cung',i,':'); write('dau: '); readln(s); end; close (f); end; Bài tốn 2 Đọc một tệp đã được lập như 6 bai 1 đưa vào mảng và in lại danh sách cung Thuật tốn: Dùng mảng dinh để ghi tên các đỉnh Dùng hàm DANHSO(w) Vừa đánh số vừa đếm số đỉnh n Dãy dinh[0], ,dinh[n-1 ] là các đỉnh đã cĩ Duyệt các đỉnh ¡ từ 0 đến n-]
Nếu cĩ dinh[i] = w thì hàm cho ¡ (là số hiệu đinh w đã cĩ)
Nếu tên đỉnh w cha cĩ trong dãy nĩi trên thì
Cho dinh[n] = w Tăng n
Và hàm cho n-1(là số hiệu đỉnh mới) Dùng hàm DOCTEPO
Trang 20procedure doc tep
Trang 21Bài tốn 3 Nhập đồ thị theo danh sách cung Xét xem cĩ hay khơng một đường đi từ định xp đến đỉnh đích Thuật tốn: Gọi hàm DOCTEPO Cho các phần tử của ma trận kề a khởi đầu bằng 0 Duyệt các cung ¡ từ 0 đến m-1 Gan a[dau[i],cuoi[i]] =1 A sẽ là ma trận kề Tính ma trận tổng t = ata’+ +a™!,
Vì ta chỉ quan tâm đến việc cĩ hay khơng một đường đi cho nên trong các
phép tốn cĩ thể thay phép + bằng | (tốn tử bit “hoặc là”) và thay phép *
bằng &(tốn tir bit “và”)
Nhập xp, dich
T[xp,dich]=l<© cĩ đường từ xp đến dich Chương trình
procedure doc _tep
Trang 24chừng nào cịn cĩ thể thì cịn tang k duyệt các cung từ 0 đến m-1 nếu đỉnh đầu thuộc Pk và đỉnh cuối chưa thuộc lớp nào thì cho đỉnh cuối vào tập P(k+1)
nếu v[dich] = 0 thì khơng cĩ đường ngược lại in đường bằng cách sau:
cho x =dich
chừng nào x cịn khác xp thì cịn
k=v[x]
in x
tìm cung cĩ đỉnh cuối = x và đỉnh đầu thuộc P(k-1)
cho x = đỉnh đầu của cung đĩ
Trang 26b) Thuát tốn Thêm mảng DAI ghi độ dài mỗi cung Khơng dùng được các hàm lập tệp và đọc tệp của đồ thị khơng cĩ trọng số Dùng thuật tốn gán mỗi đỉnh bằng một số nguyên số này cĩ thể thay đổi trong
quá trình thực hiện việc gán, mảng v để lưu giá trị này
Khởi dầu cho các phần tử của v =-1(chưa gán),
V[xp] =0
Chừng nào cịn cĩ thể thì cịn duyệt các cung t 0 đến m-I nếu đỉnh đầu đã được
gán và đỉnh cuối chưa được gán, hoặc đã được gán nhưng v[cuoi] > v[dau] + độ dài cung đĩ thì gán v[cuọ] = v[dau] + độ dài cung đĩ
Néu v[dich] =-1 (cuối cung vẫn khơng được gán) thì khơng cĩ đường, ngược lại thì in đường bằng cách sau :
¡= dich
tim c là cung cĩ đỉnh cuối là ¡ và trên đĩ xảy ra đẳng thức
Trang 27clrscr; write('moibannhaptentep muon tao:’); readln(s); assign(f,s); rewrite (f);
writeln('Moi nhap danh sach cung:
dinhdau ->dinhcuoi->dodai : "ngung go" /'); i:=1; write('cung ',i,' :'); write(' dau: '); readln(s); while s<>'/' do begin writeln(f,s); write(' cuoi: '); readln(s); writeln(f,s); write(' do dai: ');readln(s); writeln(f,s); 1:=i11; write('cung ',i,' :'); write(' dau: '); readln(s); end; close(f); end; Bài tốn 5 Nháp đồ thị theo danh sách cung Xét tính liên thơng của đồ thị Thuật tốn: Mảng v để lưu tập đỉnh liên thơng, VỊK] = I© k thuộc tập hợp Ham THEM( để xét điều kiện mở rộng liên thơng và bổ sung một phần tử mới, biến h để đếm số phần tử
Khởi đầu cho các phần tử của v = 0
Chừng nào hàm THEMQ) cịn cho giá trị đúng thì vịng lặp cịn tiếp tục Nếu h =n thì liên thơng, ngược lại thì khơng liên thơng
Chương trình:
Procedure tinh lien thong cua do_ thi;
var h,i,l:integer;dai,v:mangint;
Trang 28var k:integer; begin for k:=0 to sc-1 do if (v[dau[k]]+wv[cuoi[k]]=1) then begin v{[dau[k]]:=1; v[cuoi[k]]:=1; inc(h); them: =1; exit; end; them:=0; end; begin clrscr; doctep; ve; writeln('Do thi co ',sd,' dinh'); for i:=0 to sd-1 do begin write(itl,' : ',dinh[i],' v[i]:=0; end; V[1]:=1;h:=1l; 1:=them; while (1=1) do 1:=them; if h=sd then
writeln(' Do thi lien thong ')
Trang 29v[h] =c Tang h Nhập đỉnh xp Khởi dau v[0] = xp, h=1
Duyét cdc dinh c tir 0 dén n-1
Trang 30inc(h); end; begin clrscr; doctep; repeat writeln('Do thi co ',sd,' dinh'); for j:=0 to sd-1 do write(j+l,' : ',dinh[j],' ; '); writeln; write('Nhap so hieu dinh xuat phat:xp='); readin (xp); dec (xp); v[0O]:=xp; h:=1; for c:=0 to sd-1 do if ktra=1 then tien; writeln('Nhancuadothivohuongchuadinh', dinh[xp],' la:'); for c:=0 to h-2 do writeln(dinh[v[c]]); writeln(dinh[v[h-1]]); writeln('Banmuontieptuckhong c/k'); ch:=readkey; until ((ch='k')or(ch='K')); end; Bài tốn 7 Từm nhân đơ thị cĩ hướng Thuát tốn: Mảng v để lưu tập ổn định trong
Hàm ISIN(&) xét điều kiện đỉnh k thuộc dãy v[0], .v[h-l ]
Trang 31duyệt các đỉnh ¡ tir 0 dén n-1
nếu ISIN(i) = sai thi
duyệt các cung từ 0 đến m-1
nếu cĩ cung k sao cho đỉnh đầu = ¡ và đỉnh cuối thuộc dãy v{0], .v[h-1] thì tiếp
tục xét, ngược lại hàm cĩ giá trị sal Dùng t để lần lượt gán các đỉnh xuất phát Khởi đầu cho tiếp = đúng, T=0 vịng lặp chừng nào t cịn < n và tiếp cịn đúng thì cịn khởi đầu v[0] = t, h=1 c=0 chừng nào h cịn > = 0 và tiếp cịn đúng thì cịn nếu c >n-l thì
nếu KTRANHANQ)=đdúng thì tiếp = sai ngược lại tăng c
tang t
hết vịng lặp
Nếu tiếp = đúng thì khơng cĩ nhân
Trang 33kt:=0; for k:=0 to sc-l do if ((dau[k]=i) and(isin(cuoi[k])=1))then kt:=1; if kt=0 then begin ktranhan:=0; exit; end; end; ktranhan:=1; end; begin clrscr; repeat doctep; ve; writeln('Do thi co ',sd,' dinh'); for j:=0 to sd-1 do write(j+1,' : ",đinh[j],' ; '); writeln; tiep:=1; J:=0; while (( j<sd) and (tiep=l)) do begin v[0]:=j; h:=1; c:=0; while ((h>=0) and(tiep=1)) do if (c>sd-2) then begin if (ktranhan=1) then tiep:=0 else lui; end else
if (ktra=1) then tien
Trang 34write(dinh[v[c]],' '); write(dinh[v[h-1]],' '); end; writeln('Ban muon tiep tuc khong c/k’); ch:=readkey; until ((ch='k')or(ch='K')); end; Bài tốn 8 Nhdp dé thi theo danh sách cung.xem xét sắc số của đồ thị cĩ bằng 2 hay khơng? Thuật tốn:
Mảng v lưu hai tập mang hai màu của đồ thị (v[ï] = 1 nếu đỉnh ¡ cĩ màu thứ
nhất, v[i] =3 nếu đỉnh ¡ cĩ màu thứ 2)
Ham TIM() tim một đỉnh chưa cĩ màu (đỉnh của mảng liên thơng mới)
Ham BOSUNG(k) sơn màu một đỉnh k và xét trong mảng liên thơng chứa k, chừng nào cịn cĩ thể:
Duyệt các cung từ 0 đến m-1
Nếu đỉnh đầu và đỉnh cuối cĩ cùng một màu thì sắc số khơng thể bằng 2 Nếu một đỉnh đã cĩ màu và đỉnh kia chưa cĩ màu thì cho đỉnh chưa cĩ màu lấy màu khác Trong chương trình chính : Gọi hàm DOCTEPQ Khởi đầu gán các phần tử của v đều = 0 K=TIM()
Ching nao k cịn khác —1 (cịn mảng liên thơng chưa xét)
Goi ham BOSUNG (k) K=TIM()
Các đỉnh cĩ v =l sẽ cĩ màu 1 Các đỉnh cịn lại cĩ màu thứ 2 Chương trình:
Procedure sac so cua do_ th;
Trang 36begin repeat clrscr; doctep; ve; u:=0; for j:=0 to sd-1 do v[3]:=0; k:=tim; while (k<>-1) do begin bosung(k); k:=tim; if u=1 then break; end; 1F u<>1 then begin writeln(' Sac so bang 2'); writeln; readin; writeln('cac dinh to mau 1'); for j:=0 to sd-1 do if (v[j]=1) then write(' ',dinh[j],' '); writeln; writeln('cac dinh to mau 2'); for j:=0 to sd-1 do if (v[j]=3) then write(' ',dinh[j],' '); writeln; end; writeln('Ban muon tiep tuc khong?c/k’); ch:=readkey; until ((ch='k"')or(ch='K')); end; Bài tốn 9 Nhập đơ thị theo danh sách cung.tìm chu trình Hamiliton Thuật tốn:
Dùng thuật tốn tìm kiếm theo chiều sâu
Mảng v để lưu đường đi từ đỉnh 0
Trang 37v[h-l] vớic Hàm TIENQ v[h] =c tang h, c=0 Hàm LUIQ giảm h c= v[h+1] Khởi đầu v [0] = 0 Biến tiếp = đúng (biến này để cho vịng lặp dừng khi đã cĩ chu trình Hamiltơn) h=l, c=0 Chừng nào h cịn > 0 và tiếp cịn đúng thì cịn
Nếu c >n —I1 thì LUIQ
Ngược lại nếu hàm KTRA = đúng thì
TIENO
Nếu h=n và cĩ cung nối v[h-l] với đỉnh 0 thì cho tiếp = sai Ngược lại tăng c
Nếu tiếp = đúng thì khơng cĩ chu trình Hamilton
Nguoc lai chu trinh Hamilton 14 day v[0], ,v[h-1]
Chuong trinh:
procedure chu_trinh_ Hamilton
Var tiep,h,c:integer;v:mangin; ch:char
Trang 39if ((h=sd)and(a(v[h-1],0)=1)) then tiep:=0; end else inc(c); if (tiep=1) then begin writeln; writeln('Khong co chu trinh Hamilton'); end else begin writeln; writeln('Chu trinh Hamilton la:'); for c:=0 to h-1 do write (dinh[v[c]],' -> '); writeln(dinh[0]); end; writeln('Ban co muontieptuc khong?c/k'); ch:=readkey; until (( ch='k')or (ch='K')); end; Bài tốn 10 Nhập đồ thị vơ hướng theo danh sách cung Vẽ đường một nét của hình theo đồ thị Thuật tốn
Giả sử cĩ đồ thị vơ hướng là hình cần vẽ một nét.Ta sẽ tìm chu trình Euler hoặc đường Euler của đồ thị
Trước hết tìm đỉnh xuất phát y cĩ bậc lẻ Nếu khơng cĩ đỉnh bậc lẻ thì lấy y = đỉnh đầu của cung 0
Xuất phát từ y tìm một dãy cung nối tiếp cho đến khi khơng đi tiếp được nữa Khơng lấy đỉnh lặp lại
Chừng nào chưa hết các cung thì cịn
Trang 40dãy này vào dãy lớn đã cĩ
Dịch y đến đỉnh tiếp theo trong dãy lớn Nếu cuối cùng ta được một dãy chứa tất cả các cung của đồ thị được cách vẽ một nét, ngược lại khơng vẽ được một nét
Chương trình:
Procedure ve_duong_mot_ net;
var
p,t,g,i kl,j,n :nteger; v:mangint;