Ngoài các định nghĩa, tính chất cơ bản của đồ thị, trong chương trình bày đến một vấn đề quan trọng, đó là cách lưu trữ, biểu diễn và xử lý đồ thị trên máy tính khi đã xét những mô hình
Trang 1trường đại học sư phạm hà nội 2 khoa công nghệ thông tin
************
trần thị thu hiền
lý thuyết đồ thị và ứng dụng
khóa luận tốt nghiệp đại học
Chuyên ngành: Cử nhân Tin học
Người hướng dẫn khoa học
Th.s trịnh đình vinh
hà nội - 2010
Trang 2Mục lục
Danh mục hình vẽ 4
Lời nói đầu 5
Chương 1: cơ sở lý thuyết 7
1.1 Định nghĩa đồ thị 7
1.1.1 Đồ thị đơn 8
1.1.2 Đa đồ thị 8
1.1.3 Giả đồ thị 9
1.2 Các loại đồ thị 9
1.2.1 Đồ thị vô hướng 9
1.2.2 Đồ thị có hướng 10
1.3 Bậc đồ thị 10
1.3.1 Bậc đồ thị vô hướng 10
1.3.2 Bậc đồ thị có hướng 11
1.4 Xích, đường đi và chu trình 12
1.4.1 Xích 12
1.4.2 Đường đi 12
1.4.3 Chu trình 12
1.4.4 Tính liên thông 14
1.4.5 Xích, đường đi và chu trình Hamilton 14
1.5 Số ổn định trong, số ổn định ngoài, nhân đồ thị 16
1.5.1 Số ổn định trong 16
1.5.2 Số ổn định ngoài 16
1.5.3 Nhân đồ thị 17
1.5.4 Thuật toán tìm các tập ổn định 18
1.6 Biểu diễn đồ thị trên máy tính 19
1.6.1 Ma trận kề 19
Trang 31.6.2 Danh sách cạnh (cung) 21
1.6.3 Danh sách kề 21
1.7 Công cụ lập trình 23
Chương 2: Bài toán cờ caro 25
2.1 Mô tả bài toán 25
2.2 Phát biểu bài toán 26
2.3 Giải quyết bài toán 26
2.3.1 Phương pháp 26
2.3.2 Phân tích giải thuật 27
2.4 Một số hàm mô phỏng giải thuật 31
2.5 Một số thủ tục hàm đồ họa 36
Chương 3: Bài toán xếp lịch thi 39
3.1 Mô tả bài toán 39
3.2 Phát biểu bài toán 39
3.3 Giải quyết bài toán 39
3.3.1 Phương pháp 39
3.3.2 Phân tích giải thuật 41
3.4 Một số hàm mô phỏng giải thuật 47
3.5 Một số thủ tục hàm đồ họa 50
Kết luận và hướng phát triển đề tài 54
Tài liệu tham khảo 55
Phụ lục 56
Trang 4Danh mục hình vẽ
Hình 1.1: Khuyên, cung và cạnh bội của đồ thị 7
Hình 1.2: Đồ thị đơn 7
Hình 1.3: Đa đồ thị 7
Hình 1.4: Giả đồ thị 8
Hình 1.5: Đồ thị vô hướng 8
Hình 1.6: Đồ thị có hướng 9
Hình 1.7: Đồ thị minh họa chu trình 12
Hình 1.8: Chu trình Hamilton: {1, 2, 3, 4, 5, 1} 13
Hình 1.9: Đường đi Hamilton: {1, 2, 3, 6, 5, 4} 13
Hình 1.10: Đồ thị minh họa nhân đồ thị 16
Hình 1.11: Đồ thị minh họa việc biểu diễn bằng ma trận kề 18
Hình 1.12: Đồ thị minh họa việc biểu diễn bằng danh sách cạnh 19
Hình 2.1: Thế cờ caro và ma trận tương ứng 25
Hình 2.2: Cách đánh nhãn và đồ thị cho thế cờ hình 2.1.a 26
Hình 2.3: Thế cờ caro 28
Hình 2.4: Đồ thị minh họa cho thế cờ hình 2.3.b 28
Hình 3.1: Chu trình môn học 38
Hình 3.2: Minh họa đồ thị có xích Hamilton 40
Hình 3.3: Minh họa đồ thị có chu trình Hamilton 40
Trang 5Lời nói đầu
Bước sang năm bản lề của thế kỷ 21, nhìn lại thế kỷ 20 là thế kỷ mà con người đạt được nhiều thành tựu khoa học rực rỡ nhất, một trong những thành tựu đó là sự bùng nổ của ngành khoa học máy tính Sự phát triển kỳ diệu của máy tính trong thế kỷ này gắn liền với sự phát triển toán học hiện đại, đó là Toán rời rạc
Toán học rời rạc nghiên cứu các cấu trúc có tính chất rời rạc không liên tục Toán rời rạc bao gồm các lĩnh vực như quan hệ, lý thuyết đồ thị, lôgic toán, ngôn ngữ hình thức Trong đó lý thuyết đồ thị là một bộ phận trọng tâm với nhiều khối lượng kiến thức khá lý thú và được nghiên cứu nhiều nhất
Lý thuyết đồ thị, với cách tiếp cận đối tượng nghiên cứu và phương pháp
tư duy khá độc đáo thực sự ngày càng hữu ích và có nhiều ứng dụng phong phú Lý thuyết đồ thị có nhiều ứng dụng thực tiễn đặc biệt là trong lĩnh vực Tin học, muốn hiểu biết sâu sắc các vấn đề Tin học cần nắm vững các kiến thức về toán học rời rạc mà trong đó đặc biệt là lý thuyết đồ thị
Toán rời rạc nói chung và lý thuyết đồ thị nói riêng là công cụ thiết yếu cho nhiều ngành khoa học kỹ thuật Hơn nữa nó còn là một thành phần quan trọng trong học vấn đối với sinh viên các ngành kỹ thuật đặc biệt sinh viên ngành Tin học Bởi vì bản thân của máy tính là các quá trình làm việc mang tính rời rạc, nên điều này tương hợp gắn chặt lý thuyết đồ thị với công nghệ máy tính trong việc nghiên cứu các đối tượng có tính chất rời rạc
Từ những nhận thức trên, với đề tài "Lý thuyết đồ thị và ứng dụng" đây
không chỉ là nhiệm vụ em phải thực hiện trong bài khóa luận tốt nghiệp mà thực sự đây là đề tài mà em rất quan tâm và say mê nghiên cứu
Trang 6Đề tài được thực hiện xong bao gồm những nội dung sau đây:
Chương 1: Cơ sở lý thuyết
Nhằm trình bày những khái niệm cơ bản nhất về lý thuyết đồ thị là cơ sở tìm hiểu sâu sắc hơn các vấn đề tiếp theo Ngoài các định nghĩa, tính chất cơ bản của đồ thị, trong chương trình bày đến một vấn đề quan trọng, đó là cách lưu trữ, biểu diễn và xử lý đồ thị trên máy tính khi đã xét những mô hình biểu diễn hình học Cấu trúc dữ liệu liên quan chặt chẽ đến giải thuật, việc biểu diễn đồ thị trên máy tính như thế nào sẽ ảnh hưởng đến cách giải các bài toán ứng dụng bằng máy tính Ngoài ra trong chương còn trình bày một số phương pháp biểu diễn đồ thị trên máy tính, mỗi phương pháp đều có những ưu điểm
và nhược điểm riêng Vì vậy cần lựa chọn phương pháp sao cho phù hợp với đặc điểm từng bài toán và đạt được hiệu quả về thuật toán
Chương 2: Bài toán cờ caro
Nhằm đi vào một phần ứng dụng của lý thuyết đồ thị đó là số ổn định trong, số ổn định ngoài, nhân đồ thị và mô hình bằng đồ thị Bài toán cờ caro không chỉ là một trò chơi mà nó còn là một bài toán tin rất hay thể hiện tư duy thuật toán, cũng như cơ sở về trí tuệ nhân tạo
Chương 3: Bài toán xếp lịch thi
Với bài toán xếp lịch thi chúng ta sẽ vận dụng các lý thuyết cơ bản về đồ thị như đồ thị vô hướng, đồ thị có hướng, đường đi và chu trình Hamilton để ứng dụng cài đặt thuật toán có liên quan đến đồ thị để vẽ đồ thị và chu trình kiểm tra bậc của các nút từ đó xác định chu trình và chuyển đổi thành lịch thi
Hà Nội, tháng 05 năm 2010 Sinh viên thực hiện Trần Thị Thu Hiền
Trang 7Giả sử X là tập hữu hạn, không rỗng các phần tử nào đó và U XX
Bộ G = <X,U> được gọi là đồ thị hữu hạn Mỗi phần tử xX gọi là một đỉnh
và mỗi phần tử u = (x,y) U gọi là một cạnh của đồ thị G = <X,U>
Xét một cạnh u U khi đó tồn tại 2 đỉnh x, y X sao cho u = (x,y), ta nói rằng x nối với y hoặc x và y thuộc u
- Nếu cạnh u = (x,y) mà x và y là hai đỉnh phân biệt thì ta nói x, y là hai đỉnh
kề nhau
- Nếu u = (x,x) thì u là cạnh có hai đỉnh trùng nhau ta gọi đó là một khuyên
- Nếu u = (x,y) mà x, y là cặp đỉnh có phân biệt thứ tự hay có hướng từ x đến
y thì u là một cung, khi đó x là gốc còn y là ngọn hoặc x là đỉnh ra, y là đỉnh vào
- Khi giữa cặp đỉnh (x,y) có nhiều hơn một cạnh thì ta nói những cạnh cùng cặp đỉnh là những cạnh song song hay là cạnh bội
Trang 8a) b) c)
Hình 1.1: Khuyên, cung và cạnh bội của đồ thị
a Tại đỉnh y có một khuyên
b Một cung có hướng từ x sang y
c Cặp đỉnh (x, y) có hai cạnh song song
1.1.1 Đồ thị đơn
Đồ thị G = <X,U> được gọi là đồ thị đơn nếu giữa hai đỉnh bất kỳ được nối với nhau bởi không quá một cạnh (cung), tức là đồ thị không có cạnh bội, không có khuyên
Trang 9Đồ thị G = <X,U> được gọi là đồ thị vô hướng nếu tất cả các cạnh
e U mà cặp đỉnh thuộc nó e = (x,y) X không phân biệt thứ tự Đồ thị vô hướng là đồ thị không có bất kỳ một cung nào
Nói cách khác đồ thị vô hướng G = <V,U> bao gồm:
Trang 10Hình 1.5: Đồ thị vô hướng
1.2.2 Đồ thị có hướng
Đồ thị G = <X,U> được gọi là đồ thị có hướng nếu tất cả các cạnh e U
mà cặp đỉnh thuộc nó e = (x,y) X có phân biệt thứ tự Đồ thị có hướng là đồ thị mà mọi e = (x,y) X đều là cung
Nói cách khác đồ thị có hướng G = <V,U> bao gồm:
1.3 Bậc đồ thị
1.3.1 Bậc đồ thị vô hướng
C
Trang 11Cho đồ thị vô hướng G = <X,U> Xét một đỉnh x X, đặt m(x) là số cạnh thuộc đỉnh x khi đó m(x) được gọi là bậc của đỉnh x Nếu x có một khuyên thì m(x) được cộng thêm 2
- Nếu m(x) = 0 thì đỉnh x được gọi là đỉnh cô lập
- Nếu m(x) = 1 thì đỉnh x được gọi là đỉnh treo
Ta đặt
thì m(G) được gọi là bậc của đồ thị vô hướng G = <X,U>
1.3.2 Bậc đồ thị có hướng
Cho đồ thị có hướng G = <X,U> xét một đỉnh x X
Ta ký hiệu: m+(x) là số các cung vào của đỉnh x
m-(x) là số các cung ra khỏi đỉnh x
Khi đó ta gọi m+(x) là bậc vào của đỉnh x còn m-(x) là bậc ra của đỉnh x
- Nếu m+(x) + m-(x) = 0 thì đỉnh x được gọi đỉnh là cô lập
- Nếu m+(x) + m-(x) = 1 thì đỉnh x được gọi là đỉnh treo
(x)m (x)mm(G)
Trang 12Giả sử đồ thị G = (X,E) là một đồ thị hay đa đồ thị vô hướng
Dãy các đỉnh của G = (X,E):
Trong đó các cạnh, các đỉnh trong đường đi có thể lặp lại
Độ dài của đường đi bằng số các cạnh (hoặc cung) trong đường đi đó
* Chú ý rằng trong đồ thị có hướng, trên một cung uv chẳng hạn thì đường đi chỉ có thể đi từ gốc (u) đến ngọn (v) không thể đi ngược lại
1.4.3 Chu trình
Trang 13Xét một đường đi từ xi - xj Nếu xi xj thì đường đi này được gọi là một chu trình Như vậy chu trình là một đường đi có đỉnh xuất phát và đỉnh kết thúc trùng nhau
Chú ý rằng đường đi trong đồ thị có hướng không được đi ngược chiều mũi tên
- Đường đi (chu trình) được gọi là đơn nếu nó đi qua mỗi cạnh không quá một lần
- Đường đi (chu trình) được gọi là sơ cấp nếu nó đi qua mỗi đỉnh đúng một lần
Hình 1.7: Đồ thị minh họa chu trình
Ví dụ như ở hình 1.7 ADBE là một đường đi sơ cấp từ A đến E độ dài 3;
ABCDBE là đường đi không sơ cấp (qua B 2 lần) từ A đến E độ dài 5; ABDAB là một đường đi không đơn (chứa cạnh AB 2 lần) từ A đến B độ dài 4; ABDA là một chu trình đơn và sơ cấp độ dài 3; CC là đường đi độ dài 0
Xét đồ thị có hướng như hình 1.6.a thì ABCB là một đường đi độ dài 3;
CBA không là một đường đi vì không có cung đi từ B đến A
Vớ dụ: Xột lại vớ dụ hình 1.5.btrong đồ thị vô hướng
1, 2, 5, 4, 3 : là đường đi độ dài 4 từ đỉnh 1 đến đỉnh 3
1, 2, 5, 4, 3, 1 : là một chu trỡnh
1, 2, 4, 3 : không là đường đi vỡ (2,4) không là cạnh của đồ thị
Định lý:
Nếu trong đồ thị G = <X,U> các đỉnh đều có bậc không nhỏ hơn 2 (x
X | m(x) 2) thì trong G tồn tại ít nhất một chu trình
C
D
E
Trang 14Đường đi độ dài n từ đỉnh u đến đỉnh v, trong đó n là số nguyên dương, trên đồ thị vô hướng G = [V,U] là dãy: x0, x1, , xn-1, xn Trong đó, u = x0, v
1.4.5 Xích, đường đi và chu trình Hamilton
Xích trong đồ thị vô hướng G = (X,E) được gọi là xích Hamilton, nếu
nó đi qua tất cả các đỉnh của G và qua mỗi đỉnh đúng một lần Nói cách khác xích Hamilton là một xích sơ cấp, mà nó đi qua tất cả các đỉnh của đồ thị Trong đồ thị G:
Đường đi qua tất cả các đỉnh, mỗi đỉnh đúng một lần, được gọi là đường
đi Hamilton
Chu trình đi qua tất cả các đỉnh, mỗi đỉnh chỉ một lần (trừ đỉnh đầu trùng với đỉnh cuối) được gọi là chu trình Hamilton
Đồ thị có đường đi Hamilton được gọi là đồ thị bán Hamilton
Đồ thị có chu trình Hamilton được gọi là đồ thị Hamilton
Trang 15Tính chất:
Cho đến nay, chưa tìm ra tiêu chuẩn để nhận biết một đồ thị có là Hamilton không Phần lớn tìm được là các điều kiện đủ để một đồ thị là đồ thị Hamilton
1 Định lý Dirac (1952): Đơn đồ thị vô hướng G có n > 2 đỉnh, mỗi đỉnh có
bậc không nhỏ hơn n/2 là đồ thị Hamilton
2 Cho đồ thị có hướng G liên thông mạnh có n > 2 đỉnh Nếu mọi đỉnh có bán
bậc vào không nhỏ hơn n/2 và bán bậc ra không nhỏ hơn n/2 thì đồ thị đó là
đồ thị Hamilton
3 Cho đồ thị vô hướng G, tồn tại k đỉnh sao cho nếu xóa đi k đỉnh này và các
cạnh liên thuộc của nó thì đồ thị nhận được sẽ có nhiều hơn k thành phần liên thông Lúc đó, khẳng định được đồ thị đó không có chu trình Hamilton
4 Định lý Ore (1960): Đơn đồ thị liên thông G có n đỉnh (n 3), nếu bất kỳ hai cặp đỉnh không liền kề u và v có tổng các bậc không nhỏ hơn n (deg(u) + deg(v) n) thì đồ thị đó là đồ thị Hamilton
Trang 16Giả sử G = (X,E) là đồ thị vô hướng có n đỉnh
a Nếu với mọi x, mọi y thuộc X (m(x) + m(y) >= n-1), thì G có xích Hamilton;
b Nếu với mọi x, mọi y thuộc X (m(x) + m(y) >= n), thì đồ thị G có chu trình
Hamilton
=> 1 Mọi đồ thị đầy đủ vô hướng với ít nhất hai đỉnh đều có xích Hamilton
2 Mọi đồ thị đầy đủ vô hướng với ít nhất ba đỉnh đều có chu trình
Hamilton
3 Nếu bậc của mỗi đỉnh trong đồ thị vô hướng G không nhỏ hơn một
nửa số đỉnh thì nó có chu trình Hamilton
Định lý 2:
Trong đồ thị có hướng đầy đủ luôn luôn tồn tại đường Hamilton
1.5 Số ổn định trong, số ổn định ngoài, nhân đồ thị
1.5.1 Số ổn định trong
Cho đồ thị vô hướng G = <X,U> và A X
a) Tập A gọi là tập ổn định trong của đồ thị nếu hai đỉnh bất kỳ trong A là
không kề nhau, tức là không có một cạnh nào của đồ thị chứa hai đỉnh x và y
b) Tập A gọi là tập ổn định trong cực đại của đồ thị G nếu:
- A là tập ổn định trong
- Nếu thêm vào một đỉnh ngoài A thì A không phải là ổn định trong
Gọi L là tập hợp các tập ổn định trong của G = <X,U> Khi đó ký hiệu (G)
= Max { A / A L} và (G) được gọi là số ổn định trong của đồ thị G Như
vậy (G) là số phần tử của một tập ổn định trong cực đại nào đó
1.5.2 Số ổn định ngoài
Trang 17Cho đồ thị vô hướng G = <X,U> và B X
a) Tập B được gọi là tập ổn định ngoài của đồ thị nếu với mỗi phần tử y X \
B đều tồn tại x B sao cho có cạnh nối giữa x và y, B còn được gọi là tập thống trị của đồ thị
b) Tập B được gọi là tập ổn định ngoài cực tiểu nếu:
Hình 1.10: Đồ thị minh họa nhân đồ thị
Trang 18A4 = {3, 6, 7} A9 = {2, 4, 5, 7}
A5 = {2, 5, 7} A10 = {2, 4, 6, 7}
Tập A9 và A10 là các tập ổn định trong cực đại có 4 phần tử vì nếu thêm một đỉnh mới nữa vào các tập đó thì chúng không còn là tập ổn định trong nữa Số ổn định trong của đồ thị trên là (G) = 4
Với đồ thị trên các tập ổn định ngoài cực tiểu là B1 = A1; B2 = A2; B3 =
A3; B4 = A4 Vì các tập này nếu bớt đi một trong các phần tử của chúng thì tập còn lại không là tập ổn định ngoài nữa Số ổn định ngoài của đồ thị này là
(G) = 3 Nhân của đồ thị trên là B1, B2, B3, B4 vì các tập này là tập ổn định trong và đồng thời cũng là tập ổn định ngoài
1.5.4 Thuật toán tìm các tập ổn định
1.5.4.1 Thuật toán tìm số ổn định trong
Bước 1: Tìm các tập ổn định trong có hai phần tử bằng cách xét tất cả tổ hợp
chập 2 của n phần tử (n số các đỉnh), kiểm tra những tập nào mà phần tử của
ma trận kề tương ứng bằng 0 thì tập đó là ổn định trong
Bước 2: Duyệt từng tập có 2 phần tử và bổ sung thêm phần tử thứ 3 và kiểm
tra từng cặp như bước 1, tập nào thỏa ta được tập ổn định trong 3 phần tử
Bước k: Giả sử đã tìm được m tập con ổn định trong có k + 1 phần tử
+ Duyệt từng tập và bổ sung vào các tập đó thêm một phần tử
+ Nếu không có tập nào bổ sung được nữa thì dừng
1.5.4.2 Thuật toán tìm số ổn định ngoài
Xét G = <X,U> với X = {x1, x2, ,xn}
Trang 19Bước 1: Xác định các tập (xi), i = 1…n với (xi) = {xi và các đỉnh kề với
xi}
Bước 2: Từ các tập (x1), (x2), , (xn) ta tìm tập B
B = {xk1 , xk2 , , xkm} sao cho (xk1) (xk2) (xkm) = X
Khi đó B là tập ổn định ngoài cực tiểu
1.6 Biểu diễn đồ thị trên máy tính
Lĩnh vực đồ thị có nhiều ứng dụng trong thực tế, có thể mô hình nhiều ứng dụng bằng đồ thị và sử dụng máy tính để giải quyết các bài toán về ứng dụng đó Nên việc biểu diễn và lưu trữ đồ thị trên máy tính là một vấn đề khá trọng tâm, phương thức biểu diễn từng loại đồ thị trên máy tính ảnh hưởng đến các giải thuật, phương pháp giải quyết các ứng dụng trên máy tính
1.6.1 Ma trận kề
Phương pháp này dựa trên mối quan hệ giữa các cặp đỉnh, mỗi đồ thị được đặt tương ứng với một ma trận vuông cấp n (n là số đỉnh của đồ thị) Gọi ma trận kề là A = (aij); i, j = 1 n
+ Trường hợp G = <X,U> là đồ thị vô hướng với X = {x1, x2, ,xn} khi đó mỗi phần tử aij của ma trận A được xác định như sau: aij = aji = d, nếu cặp đỉnh (xi, xj) có d cạnh nối với nhau Khi cặp đỉnh (xi, xj) không có cạnh nào nối với nhau thì aij = 0 Ta thấy ma trận kề của đồ thị vô hướng là ma trận đối xứng
+ Trường hợp G = <X,U> là đồ thị có hướng với X = {x1, x2, ,xn} thì mỗi phần tử aij của A được xác định như sau: Đối với mỗi cặp đỉnh (xi, xj) từ xiđến xj nếu có d cung thì aij = d Chú ý aji = 0 nếu không có cung nào hướng từ
xj đến xi Ma trận kề trong trường hợp này là không đối xứng
Trang 20Trong hai trường hợp trên ta chú ý nếu đỉnh xi có một khuyên thì phần tử tương ứng của ma trận kề là aii = 1
Hình 1.11: Đồ thị minh họa việc biểu diễn bằng ma trận kề
Ta có thể dùng ma trận kề biểu diễn đồ thị G1 và G2 trong hình 1.11 như
sau:
Đối với đồ thị có trọng số mỗi cạnh e = (xi, xj) được gán một trọng số l(e)
(còn viết là l(xi, xj)) thì ma trận kề của nó được thay bằng ma trận có trọng số, khi đó mỗi phần tử của ma trận bằng trọng số của cạnh tương ứng: aij = l(xi,
xj)
Ưu điểm của phương pháp này là dễ dàng xác định được các cặp đỉnh có
kề nhau hay không hoặc rất thuận tiện khi tìm số bậc của mỗi đỉnh Việc truy cập phần tử của ma trận kề qua chỉ số không phụ thuộc vào số đỉnh của đồ thị Nhược điểm lớn nhất của phương pháp này là không phụ thuộc vào số cạnh của đồ thị, ta luôn phải sử dụng n2 đơn vị bộ nhớ để lưu trữ ma trận kề của nó
Định lý: Nếu G = <X,U> là đa đồ thị với A = (aij) là ma trận kề tương ứng, thì số đường đi khác nhau từ đỉnh xi đến đỉnh xj có độ dài s bằng phần tử Pijcủa ma trận tích AA A = As = (Pij)
0 0 2 1
1 2 0 1
0 1 1 1
2
G
M
s lần
Trang 21Hình 1.12: Đồ thị minh họa việc biểu diễn bằng danh sách cạnh
Ví dụ: Hình 1.12 đồ thị G1 và G2 được biểu diễn bằng danh sách cạnh (cung) như sau:
Như vậy để lưu trữ đồ thị cần sử dụng 2m đơn vị bộ nhớ Nhược điểm của phương pháp này là để xác định những đỉnh nào của đồ thị là kề với một đỉnh cho trước chúng ta phải làm cỡ m phép so sánh
Trang 222 Nil
Phương pháp biểu diễn bằng danh sách kề cũng được sử dụng khá phổ biến và thường hay dùng cho đồ thị có hướng
Danh sách kề cho đỉnh xi là danh sách gồm tất cả các đỉnh kề của xi theo thứ
tự các đỉnh trong tập đỉnh X Ta có thể biểu diễn đồ thị như một mảng FIRST, với phần tử FIRST[i] là con trỏ trỏ tới danh sách kề cho đỉnh xi
Ví dụ: Hình 1.12 đồ thị G1 và G2 được biểu diễn bằng danh sách kề sau: FIRST
Trang 23Nhược điểm của cách biểu diễn này là thời gian cần thiết để xác định có một cạnh đi từ đỉnh xi tới đỉnh xj hay không là O(n) Cách biểu diễn này thích hợp cho các thuật toán mà cấu trúc đồ thị hay thay đổi như thêm hoặc bớt các cạnh
1.7 Công cụ lập trình
Trong bài khóa luận, em thực hiện chương trình dựa trên ngôn ngữ lập trình C và C++ trong môi trường Tubor C++ 3.0
C là một ngôn ngữ lập trình tương đối nhỏ gọn vận hành với phần cứng
C được coi là có khả năng di động đó là việc mã C có thể được dịch và thi hành trong hầu hết các máy tính C đã được tạo ra với một mục tiêu là làm cho nó thuận tiện để viết các chương trình lớn với số lỗi ít hơn
Cấu trúc một chương trình C đơn giản:
Int main (void)
Dòng trên hiển thị một hàm chuẩn trên main Hàm này có mục đích đặc biệt trong C Khi chương trình thi hành thì hàm main() được gọi trước tiên Phần
mã int chỉ ra rằng giá trị trả về của hàm main (tức là giá trị mà main() sẽ được trả về sau khi thực thi) sẽ có kiểu là một số nguyên Còn phần mã (void) cho biết rằng hàm main sẽ không đến tham số để gọi nó
Trang 24Return 0;
Dòng này sẽ kết thúc việc thực thi mã của hàm main và buộc nó trả về giá trị
0 (là một số nguyên như khai báo ban đầu int main)
}
Dấu cho biết việc kết thúc mã cho hàm main
C++ là ngôn ngữ lập trình hướng đối tượng phát triển dựa trên C Những ngôn ngữ cấp cao như C++ cung cấp các ký hiệu thuận tiện hơn nhiều cho việc thi hành các giải thuật Chúng giúp cho các lập trình viên không phải nghĩ nhiều về các thuật ngữ cấp thấp và giúp họ chỉ tập trung vào giải thuật Cấu trúc một chương trình C++ đơn giản:
// my first program in C++
Tất cả các dòng bắt đầu bằng hai dấu sổ (//) được coi là chú thích mà chúng không hề có một ảnh hưởng nào đến hoạt động của chương trình
#include <iostream.h>
Các câu bắt đầu bằng dấu (#) được dùng để báo cho trình dịch ở đây câu lệnh
#include <iostream.h> báo cho trình dịch biết cần phải “include” thư viện iostream Đây là một thư viện vào ra cơ bản trong C++
Int main()
Dòng này tương ứng với phần bắt đầu khai báo hàm main Hàm main là điểm
mà tất cả các chương trình C++ bắt đầu thực hiện Nó không phụ thuộc vào vị
Trang 25trí của hàm này mà nội dung của nó luôn được thực hiện đầu tiên khi chương trình bắt đầu
Dòng này được kết thúc bằng dấu chấm phẩy ( ; ) Ký tự này được dùng để kết thúc một lệnh và bắt buộc phải có sau mỗi lệnh trong chương trình C++
Return ;
Lệnh return kết thúc hàm main và trả về mã đi sau nó
C++ nguyên là sự kết thừa từ C Mặc dù vậy, không phải mọi chương trình trong C đều hợp lệ trong C++ Vì là hai ngôn ngữ độc lập, số lượng không tương thích giữa hai ngôn ngữ đã tăng lên Các sự khác nhau này tạo ra khó khăn để viết các chương trình và thư viện để có thể được dịch và hoạt động chính xác trong cả hai loại mã C và C++, đồng thời gây nhầm lẫn cho những người lập trình dùng hai ngôn ngữ này Sự chênh lệch này cũng gây khó khăn cho ngôn ngữ này có thể tiếp thu các tính năng của ngôn ngữ kia
}
Dấu cho biết sự trả về của hàm main
Chương 2 Bài toán cờ caro
2.1 Mô tả bài toán
Trang 26Ta xét một ứng dụng của đồ thị cho bài toán lập trình chơi cờ Caro trên máy tính Cờ caro là loại cờ mà rất nhiều bạn trẻ đặc biệt giới sinh viên học sinh ưa thích Quy tắc và cách thức chơi đơn giản, nhưng nó thực sự là bài toán tin rất hay, là bài lập trình thể hiện nhiều tư duy thuật toán, cũng như cơ
sở về trí tuệ nhân tạo cho việc lập trình trò chơi giữa người và người
2.2 Phát biểu bài toán
Bài toán chơi cờ caro được phát biểu như sau:
Lập một bàn cờ caro cho hai người chơi sao cho thứ tự chơi từ người thứ nhất rồi lại đến người thứ hai Cứ lần lượt như thế cho đến khi tìm ra người thắng cuộc Người chơi được coi là thắng cuộc khi xếp được 4 quân liên tiếp thẳng hàng dọc, thẳng hàng ngang, thẳng chéo trái hoặc chéo phải hoặc 5 quân liên tiếp khi bị chặn bởi quân của đối phương Và khi đó một ván cờ mới được coi là kết thúc
2.3 Giải quyết bài toán
Trang 27Cấu trúc dữ liệu cho thế cờ này có thể dùng bảng ma trận như hình 2.1.b,
với 0 là vùng trắng, 1 là quân "O" và 2 là quân "X" Nhưng như vậy việc tính toán sẽ rất khó khăn, ta có thể dùng đồ thị làm cấu trúc dữ liệu cho thế cờ Caro, khi đó việc tính toán sẽ dễ dàng đi và tận dụng những tính chất đã nghiên cứu về đồ thị thì bài toán lập trình trò chơi caro sẽ trở nên thuận lợi hơn nhiều
2.3.2 Phân tích giải thuật
* Mô hình bằng đồ thị theo vị trí liền kề
Ta xây dựng một đơn đồ thị theo nguyên tắc sau:
- Mỗi một quân "X" hoặc quân "O" thì tương ứng với một đỉnh
- Hai đỉnh là kề nhau nếu tương ứng với hai quân ở vị trí liên tiếp nhau
- Mỗi một cạnh được gán một nhãn, nhãn cho biết hai đỉnh kề nhau là kề đứng, kề chéo hay là kề ngang trong thế cờ Ta gán tên nhãn như sau: thẳng ngang nhãn là 1, thẳng chéo trái là 2, thẳng dọc nhãn là 3, thẳng chéo phải là
4 (xem hình 2.2.a)
Trang 28a) b)
Hình 2.2: Cách đánh nhãn và đồ thị cho thế cờ hình 2.1.a
a Cách đánh nhãn
Ví dụ đồ thị như hình 2.2.b là thể hiện cho thế cờ hình 2.1.a
Trong luật chơi cờ caro nếu quân "X" đi trước thì ngay sau đó là quân
"O" đi sau, tiếp tục lại "X" rồi lại "O" Chính điều này ta có thể coi những quân "X" tương ứng là những đỉnh số lẻ, quân "O" tương ứng những đỉnh số chẵn hoặc ngược lại
Trong một thế cờ Caro nếu tồn tại một dãy 4 quân liên tiếp của "X" hoặc
"O" được sắp thẳng hàng ngang, thẳng hàng dọc hoặc thẳng hàng chéo thì thắng Với đồ thị nếu tồn tại một đường đi các cạnh cùng nhãn gồm 4 đỉnh số
lẻ, hoặc số chẵn thì thế cờ thắng cho tương ứng quân "X" hoặc quân "O"
Xét đồ thị hình 2.2.b đã có một đường đi cùng nhãn 4 gồm 3 đỉnh cùng
quân X1, X2, X3 Nếu ta thêm một đỉnh X6 kề với đỉnh O2 sao cho cạnh (O2,
X6) có nhãn 4 thì bây giờ ta có một đường đi cùng nhãn 4 gồm 4 đỉnh quân
Trang 29- Với mô hình này ta sẽ không thể thấy được đầy đủ mối quan hệ giữa
các đỉnh, như đồ thị hình 2.2.b đỉnh O3 là đỉnh cô lập, trong thế cờ hình 2.1.a
O1 có mối quan hệ thẳng hàng với X1 và X3 nhưng trong đồ thị tương ứng ta không nhìn thấy được mối quan hệ này nên khó tính toán được nước đi cho lần sau Mà mối quan hệ "thẳng hàng" giữa các quân là quan trọng trong bài toán lập trình trò chơi caro
- Mô hình này chỉ thích hợp cho việc lập trình khi mà chỉ chơi giữa
ngư-ời với ngưngư-ời, lúc này bài toán là tìm đường đi cùng nhãn gồm 4 đỉnh cùng quân, không phải là bài toán tính nước đi cho các bước tiếp theo
* Mô hình bằng đồ thị theo mối quan hệ thẳng hàng
Cách xây dựng này tương tự như cách thứ nhất nhưng có những đặc điểm sau:
- Hai đỉnh X và O là kề nhau nếu tương ứng với hai quân X và O mà chúng có mối quan hệ là thẳng hàng với nhau
- Trên mỗi cạnh ngoài nhãn thể hiện mối quan hệ thẳng hàng, ta thêm một trọng số đường đi, trọng số của cạnh (X,O) là số ô đi thẳng hàng từ quân
X đến quân O trong thế cờ
- Hai đỉnh X và O chỉ được kề nhau khi trọng số cạnh (X,O) không quá
4
Trang 30Ví dụ xét thế cờ như hình 2.3.b thì đồ thị tương ứng của nó như hình 2.4
Hình 2.4: Đồ thị minh họa cho thế cờ hình 2.3.b
Mỗi cạnh của đồ thị, nhãn đặt trước trọng số, trọng số đứng sau cách
nhãn bởi dấu phẩy Xét thế cờ hình 2.3.a từ quân X1 đến quân X2 cách nhau một ô nếu tính từ X1 nên trọng số cạnh (X1, X2) là 1, quân X1 cách X3 hai ô nên trọng số (X1, X3) là 2 Ta thấy X1, X2, X3 đều thẳng hàng dọc nên nhãn là
3, và tương tự đánh nhãn và trọng số cho các cạnh còn lại Như vậy nếu tồn tại một đường đi cùng nhãn và có trọng số 1 gồm 4 đỉnh cùng quân thì thế cờ
thắng, ở đồ thị hình 2.3.a đường đi thắng cho quân x là (X1, X2, X3,X4)