Tải bản đầy đủ (.pdf) (60 trang)

Lý thuyết đồ thị và ứng dụng

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (545.87 KB, 60 trang )

trườ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

1


Mụ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

2


1.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

3


Danh 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

4


Lờ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.

5


Đề 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

6


Chương 1
cơ sở lý thuyết
1.1. Định nghĩa đồ thị
Đồ thị là một cấu trúc rời rạc bao gồm các đỉnh và các cạnh nối các đỉnh
này, các loại đồ thị khác nhau được phân biệt bởi kiểu và số lượng cạnh nối
hai đỉnh nào đó của đồ thị.
Giả sử X là tập hữu hạn, không rỗng các phần tử nào đó và U  X  X.
Bộ G = <X,U> được gọi là đồ thị hữu hạn. Mỗi phần tử x X 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.
x

u

y

- 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.

7


y

x

a)

x

y

b)

y

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.

A

B

C
D

Hình 1.2: Đồ thị đơn
1.1.2. Đa đồ thị
Đồ thị G = <X,U> được gọi là đa đồ thị nếu nó có ít nhất một cặp đỉnh
được nối với nhau bởi hai cạnh (hai cung) trở lên.
A

B

C
D

8


Hình 1.3: Đa đồ thị
1.1.3. Giả đồ thị
Giả đồ thị là đồ thị có ít nhất một khuyên, có thể chứa cạnh bội, cạnh
đơn. Tóm lại đây là loại đồ thị tổng quát nhất.

A

B


C
D

Hình 1.4: Giả đồ thị
1.2. Các loại đồ thị
1.2.1. Đồ thị vô hướng
Đồ 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:
V: Tập các đỉnh của đồ thị
U: Tập các cặp không có thứ tự gồm hai phần tử khác nhau của V gọi là các
cạnh, tức là (u,v)=(v,u)
A

B

C
D

a)

b)

9


Hì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:
V: Tập các đỉnh của đồ thị
U: Tập các cặp không có thứ tự gồm hai phần tử khác nhau của V gọi là các
cung, tức là (u,v)  (v,u). Cung (u,v) còn gọi là cung đi từ đỉnh u đến đỉnh v.
Ký hiệu: u  v

C
A

B

a)

b)
Hình 1.6: Đồ thị có hướng

1.2.3. Đồ thị hỗn hợp
Đồ thị G = <X,U> vừa có cạnh vô hướng, vừa có cạnh có hướng thì nó
được gọi là đồ thị hỗn hợp, loại đồ thị này rất ít khi được dùng tới.
Chú ý rằng vấn đề phân chia đồ thị và các thuật ngữ về đồ thị chỉ mang tính
tương đối, hiện nay vẫn còn chưa mang tính thống nhất chuẩn trên nhiều tài
liệu.
1.3. Bậc đồ thị
1.3.1. Bậc đồ thị vô hướng

10



Cho đồ 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.

m(G) 
x

 m(x)

xX

m(x) = 3

x

m(x) = 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.

m(G)  m (x) 
xX

 m (x)


xX

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.
Ta đặt

Khi đó m(G) được gọi là bậc của đồ thị có hướng G = <X,U>.
Trong đồ thị có hướng thì m+(x) = m-(x) = U

11


Ví dụ:
- Xét đồ thị vô hướng như trong hình 1.5.a ta có:
m(G) = m(A) + m(B) + m(C) + m(D) = 2 + 5 + 2 + 1 = 10
- Xét đồ thị có hướng trong hình 1.6.a ta có:
m(G) = [m+(A) + m+(B) + m+(C) ] + [m-(A) + m-(B) + m-(C)]
= [1 + 2 + 1] + [2 + 1 +1] = 8
1.4. Xích, đường đi và chu trình
1.4.1. Xích
Giả 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):
 = [ x1, x2, ... xi, xi+1, ..., xn-1, xn]

được gọi là một xích hay một dây chuyền, nếu với mọi i (i đi từ 1 đến n) cặp
đỉnh xi, xi+1 kề nhau.
1.4.2. Đường đi

Xét đồ thị G = <X,U> với :
- Tập đỉnh X = {x1,x2,...,xn}
- Tập cạnh U = {u1,u2,...,um}
Tập hợp các đỉnh kề nhau từ xi đến xj được gọi là một đường đi, kí hiệu
xixi1xi2 ... xj  xiuixi1ui1xi2ui2 ... ujxj
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

12


Xé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.
A

E

B

C

D

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.

13


Đườ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
= xn, (xi, xi+1)  U, (i = 0, 1,..., n-1).
Chu trình là đường đi có đỉnh đầu trùng đỉnh cuối.
1.4.4. Tính liên thông
Đồ thị vô hướng G = [V,U] được gọi là liên thông nếu luôn tìm được
đường đi giữa hai đỉnh bất kỳ của nó.

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.
2

3

5

4

1

Hình 1.8: Chu trỡnh Hamilton: { 1, 2, 3, 4, 5, 1 }

14


1

2

3


6

5

4

Hình 1.9: Đường đi Hamilton: {1, 2, 3, 6, 5 , 4 }
Tí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.
Một số định lý thường dùng:
Định lý 1:

15


Giả 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

16


Cho đồ 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:
- B là tập ổn định ngoài.
- Nếu bớt một phần tử bất kỳ của B thì B không còn là tập ổn định ngoài.
Gọi M là tập của tất cả các tập ổn định ngoài của G = <X,U>. Khi đó ký hiệu
 (G) = Min { B / B  M} và  (G) được gọi là số ổn định ngoài của đồ thị

G.
Đối với các tập ổn định ngoài, ta thường quan tâm đến tập ổn định ngoài có số
phần tử ít nhất vì lực lượng của nó liên quan tới số ổn định ngoài của đồ thị.
1.5.3. Nhân đồ thị
Cho đồ thị vô hướng G = <X,U>. Nếu tập A (A  X) vừa là tập ổn định
trong vừa là tập ổn định ngoài của đồ thị G thì A được gọi là nhân của đồ thị.
Đối với nhân của đồ thị, ta quan tâm tới nhân có số phần tử ít nhất.
4

1

7
6

2

5

3

Hình 1.10: Đồ thị minh họa nhân đồ thị
Ví dụ: xét đồ thị hình 1.10 ta có:
Các tập ổn định trong của đồ thị là:
A1 = {1, 5, 7}


A6 = {2, 6, 7}

A2 = {1, 6, 7}

A7 = {4, 5, 7}

A3 = {3, 5, 7}

A8 = {4, 6, 7}

17


A4 = {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}

18


Bước 1: Xác định các tập  (xi), i = 1…n với  (xi) = {xi và các đỉnh kề với
x i}
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.

19


Trong 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.

A
C

B

A

B


C

D

G1

G2

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)

M G1

1

1

1

0


1
0
2
1

1

2
0
0

0 

1
0

0 

(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,
x j)
Ư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ử Pij
của ma trận tích A  A  ...  A = As = (Pij)
0 1 1 


M G2   0 1 0
1 1 0 




s lần

20


1.6.2. Danh sách cạnh (cung)
Cho đồ thị G = <X,U> với số cạnh m, số đỉnh n. Nếu m < 6n thì G
thường được biểu diễn dưới dạng danh sách cạnh (cung).
Theo cách này danh sách tất cả các cạnh (cung) của đồ thị vô hướng (có
hướng). Mỗi cạnh (cung) e = (x,y) của đồ thị tương ứng với hai biến Dau[e],
Cuoi[e].

4

2

1

2

1

3

3

G1

4


G2

Hì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:

Dau Cuoi
1
2
1
3
2
3
2
4
3
4
Danh sách cạnh G1

Dau Cuoi
1
2
2
3
3
1
4
1
4

2
Danh sách cung G2

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.
1.6.3. Danh sách kề

21


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
1

2

3

2

1

3


4

Nil

1

2

4

Nil

2

3

3

Nil

Nil

4
a) Danh sách kề của đồ thị G1

FIRST
1

2


Nil

2

3

Nil

1

Nil

3

2

3

Nil

4
b) Danh sách kề đồ thị G2
Bộ nhớ sử dụng cho phương pháp biểu diễn danh sách kề là tỷ lệ thuận
với tổng số đỉnh và các cạnh của đồ thị.

22


Nhượ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:
// 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 <stdio.h>
Đây là một chỉ thị tiền xử lý #include. Điều này sẽ làm cho bộ tiền xử lý tiến
hành thay dòng lệnh đó bởi toàn bộ các dòng mã hay thực thể trong tập tin mà
nó đề cập đến. Dấu ngoặc nhọn bao quanh stdio.h cho biết rằng tập tin này có
thể tìm thấy trong các nơi đã định trước cho bộ tiền xử lý biết thông qua các
đường tìm kiếm đến các tập tin header.
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ó.

23


{

Dấu cho biết sự bắt đầu định nghĩa của hàm main.
Printf (“”);
Dòng trên gọi đến một hàm chuẩn khác tên là printf. Hàm này đã được khai
báo trước đó trong tập tin stdio.h. Dòng này sẽ cho phép tìm và thực thi mã
(đã được hỗ trợ sẵn) với ý nghĩa là hiển thị lên đầu ra chuẩn dòng chữ.
Return 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ị

24


trí 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ấu cho biết sự bắt đầu định nghĩa của hàm main.
Cout << “”;
Dòng này làm việc quan trọng nhất của chương trình. Cout là một dòng
(stream) output chuẩn trong C++ được định nghĩa trong thư viện iostream và
những gì mà lệnh này cần thực hiện là gửi chuỗi ký tự trong dấu “” ra ngoài
màn hình.
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

25



×