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.. Được gọi là đồ th
Trang 1LỜ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 hoá 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 hoàn toà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 khoá Khoá 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
§6 Các phương pháp tìm kiếm
Trang 2Phần II: Các giải thuật của các bài toá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 toán và
các chương trình viết bằng ngôn ngữ Pascal kèm theo
Để hoàn thành khoá 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 toà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ế khoá 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ứ
Tác giả
Trang 3cạ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
Trang 4Trong 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,
Khi đó G(X,E) còn được kí hiệu bằng G(X,, X,, E)
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ị
G nếu M(¡.j ) =l © (¡.j ) là cung của G
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 (ơ) Ngoà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
Đồ thị có hướng G = (X, E) được gọi là đồ thị liên thông mạnh 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
Ký hiệu S () là bậc của đỉnh ¡, m là số cung của đồ thị Khi đó tổng của SŒ)
lấy với mọi ¡ sẽ bằng 2m
Trang 8Trong đồ 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:
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)
Ký hiệu w, là tổng theo mod 2 của v, và u,
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 hoá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
Gọi m là số cung, n là số đỉnh, p là số thành phần liên thông khi đó m — n +
p gọi là chu số của đồ thị
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
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 đó
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
Hiển nhiên nếu B ổn định trong thi B'` c B cũng ổn định trong.
Trang 11bằ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 toán có 8 con hậu chính là một trường hợp của bài toá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
cờ 8 x 8 để chúng không ăn lẫn nhau Đặt như 12 sơ đồ sau:
Trang 124.2 Tap 6n dinh ngoai
4.2.1 Dinh nghia:
Cho đồ thị G( A,F ).Tap BCA goi là ổn định ngoà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 ngoài
4.2.2 Số ổn định ngoài:
Dùng P (G) để ký hiệu họ gồm tất cả các cặp ổn định ngoài của đồ thị G Định nghĩa: Số phần tử của một trong những tập ổn định ngoài có lực lượng
bé nhất được gọi là số ổn định ngoài của đồ thị G, đồng thời đượcký hiệu
bằng B (G), nghĩa là: B (G)= min {| Al/A € PG) }
Chú ý: Đối với khái niệm ổn định ngoài, người ta quan niệm trước hết đến các tập ổn định ngoài có lực lượng cực tiểu, tức những tập ổn định ngoài có số phần tử bằng số ổn định ngoài của đồ thị.
Trang 13Ví dụ: Bài toán về 5 con hậu chính là trường hợp của bài toá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 ngoà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 ngoà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 ngoà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 ngoà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 ngoà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 ngoà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ờ
¡) Nhân không chứa đỉnh nút
1i) Nếu F(x)=o thì x phải thuộc nhân
1i) Tập rỗng không phải là nhân
Trang 14* Chú ý: Nêú g là hàm Grandi của đồ thị G thì tâp B={x\ g(x) = 0} là một
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)
Đồ thị vô hướng liên thông G là đồ thị Euler khi và chỉ khi mọi đỉnh của G đều có bậc chan
Trang 15Da đồ thị liên hợp có chu trình Euler khi và chỉ khi tại mỗi đỉnh a số
cung vào bằng số cung ra
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 toán tìm kiếm
Bài toá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 toán fìm kiếm
Ký hiệu là DS là một danh sách gồm một số trạng thái
Khởi đầu cho DS = {so}
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 toá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 toá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
Trong phương pháp này việc tìm kiếm có tính chất “lan dân” như hình ảnh một vết dầu loang
Trang 18PHẦN 2: CÁC GIẢI THUẬT CỦA MỘT SỐ BÀI TOÁN CƠ
BẢN TRÊN ĐỒ THỊ
Viết bằng ngôn ngữ lập trình Pascal
PROGRAM chuong_ trinh do_ thi
mangs= array[0 1000] of string[30];
mangint= array[0 1000]of integer;
Bài toá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
đưa w vào tệp (đỉnh cuối của cung)
đọc tiếp w (sẽ là đỉnh đầu của cung tiếp theo)
Trang 19write('cung ',i,':'"); write('dau: `); Readln(s);
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ì
Trang 20procedure doc tep
var i,m:integer; w:string;
Trang 21Bài toán 3 Nhập đồ thị theo danh sách cung Xét xem có hay không một
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 toán có thể thay phép + bằng | (toán tử bit “hoặc là”) và thay phép *
bằng &(toá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 22begin
writeln('cung ',it1,':',dinh[dau[i]], >
đinh[cuoi[1]]); end;
Trang 24nế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 đó
in thêm đỉnh xp, độ dài đường là v[dich]
break;
end;
Trang 26quá 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
v[cuoi] = v[dau] + do dài cung
Trang 27writeln('Moi nhap danh sach cung:
dinhdau ->dinhcuoi->dodai : "ngung go" /');
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;
function them:integer;
Trang 28writeln(' Do thi lien thong ')
else writeln('Do thi khong lien thong');