Tải bản đầy đủ (.doc) (72 trang)

Xây dựng chương trình hỗ trợ giảng dạy Lý thuyết đồ thị

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 (657.03 KB, 72 trang )

Ubnd tỉnh phú thọ
Trờng đại học hùng vơng
================
Chủ nhiệm đề tài: Ths. Lê Quang Khải
Cộng tác viên: CN. Vũ Ngọc Trì
CN. Nguyễn Huỳnh
1
MỞ ĐẦU
1. Lý do chọn đề tài
Ngày nay công nghệ thông tin đã xâm nhập sâu rộng vào mọi lĩnh vực của
đời sống xã hội, trở thành một công cụ không thể thiếu của các nhà khoa học,
cán bộ chuyên môn. Sự phát triển kỳ diệu của máy tính gắn liền với sự phát
triển toán học hiện đại, trong đó lý thuyết đồ thị là một bộ phận quan trọng với
nhiều ứng dụng hữu ích và được nghiên cứu nhiều nhất.
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 và là một nội dung quan trọng trong chương
trình đào tạo sinh viên các ngành CNTT. 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 có nhiều ứng dụng phong phú. Máy tính mà bản thân nó với 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.
Tin học là công cụ đắc lực, là lĩnh vực có nhiều ứng dụng phục vụ cho
nhiều ngành khác nhau trong đời sống xã hội. Cho nên việc nghiên cứu các vấn
đề ứng dụng cho tin học cũng là việc nghiên cứu các ứng dụng được giải quyết
như thế nào trên máy tính. Có nhiều bài toán ứng dụng, nếu được mô hình hoá
bằng đồ thị thì sẽ dễ dàng giải quyết được trên máy tính, vì cấu trúc và quá
trình xử lý lữu trữ thông tin trên máy tính có tính chất rời rạc không liên tục.
Đồ thị đóng vai trò quan trọng làm cơ sở toán cho tin học, ứng dụng của
đồ thị là rất thực tiễn và quan trọng, việc nghiên cứu lý thuyết đồ thị và các ứng
dụng của nó góp phần phát triển các kỹ thuật Tin học, đặc biệt trong khâu lập
trình. Vì những lý do trên tôi quyết định chọn đề tài nghiên cứu “Xây dựng


chương trình hỗ trợ giảng dạy Lý thuyết đồ thị”.
2. Mục tiêu đề tài
Xây dựng phần mềm máy tính giải các bài toán điển hình về đồ thị để hỗ
trợ cho giảng viên Tin học giảng dạy các nội dung của học phần Lý thuyết đồ
thị.
2
3. Đối tượng, phạm vi nghiên cứu
3.1 Đối tượng nghiên cứu
- Lý thuyết đồ thị và thuật toán điển hình
- Ngôn ngữ lập trình máy tính
3.2 Phạm vi nghiên cứu
- Nội dung học phần Lý thuyết đồ thị hiện đang giảng dạy tại các lớp
CNTT ở trường ĐH Hùng Vương.
4. Phương pháp nghiên cứu
Phương pháp nghiên cứu lý luận.
Phương pháp tổng kết kinh nghiệm
Phương pháp lấy ý kiến chuyên gia.
3
PHẦN 1: LÝ THUYẾT ĐỒ THỊ
CHƯƠNG 1: ĐẠI CƯƠNG VỀ ĐỒ THỊ
1.1. Khái niệm
1.1.1. Đồ thị
Khái niệm đồ thị
Một đồ thị G(V,E) bao gồm một tập hợp hữu hạn V các nút (đỉnh,
vertices) và một tập hợp hữu hạn E các cặp đỉnh gọi là cung (cạnh, edges).
Hình 1.1. Mô hình hóa bản đồ địa lý bằng đồ thị
1.1.2. Các dạng đồ thị
- Các đặc điểm của cạnh để phân biệt các dạng đồ thị cụ thể:
+ Cạnh e
1

= (u,v) và cạnh e
2
= (t,k) trên đồ thị G gọi là cạnh lặp nếu u ≡ t
và v ≡ k.
+ Các cạnh e thuộc E được gọi là có hướng nếu thứ tự hai đỉnh trên một
cạnh trên đồ thị G được quan tâm tới: phân biệt hai cạnh e1 = (u,v) và e2 =
(v,u).
- Từ đó có các dạng đồ thị cơ bản:
4
Tồn tại cạnh lặp Không tồn tại cạnh lặp
Cạnh có hướng Đa đồ thị có
hướng
Đơn đồ thị có hướng
Cạnh vô hướng Đa đồ thị vô
hướng
Đơn đồ thị vô hướng
Môn học này sẽ làm việc với đơn đồ thị có hướng và đơn đồ thị vô
hướng. Do đó trong các nội dung trình bày ở các phần sau sẽ nói tắt “đồ thị”
thay cho “đơn đồ thị”.
- Một số dạng đơn đồ thị vô hướng đặc biệt:
+ Đồ thị đầy đủ K
n

Là đơn đồ thị vô hướng mà giữa hai đỉnh bất kì của nó luôn tồn tại cạnh
nối.
+ Đồ thị vòng C
n
5
Là đơn đồ thị vô hướng G = (V,E) với tập đỉnh V = {1, 2, 3, , n} và tập
cạnh E = {(1,2); (2,3); (3,4); ; (n-1,n); (n,1)}.

Hình 1.2. Các đồ thị K
n
, C
n
và W
n
và K
4,3
+ Đồ thị bánh xe W
n
Là đơn đồ thị vô hướng thu được từ đồ thị C
n-1
bằng cách thêm một đỉnh
n nối với n-1 đỉnh của đồ thị C
n-1
.
+ Đồ thị hai phía
Là đồ thị mà tập đỉnh có thể phân hoạch thành hai tập con V = X U Y
sao cho mọi cạnh thuộc E đều nối một đỉnh thuộc X với một đỉnh thuộc Y.
6
K
3
K
4
K
5
C
3
C
4

C
5
W
4
W
5
W
6
1.1.3. Các khái niệm liên quan
- Cho đồ thị G = (V, E): V = {1, 2, , n} và E = {e
1
, e
2
, , e
m
}. Các
khái niệm được trình bày dưới đây có thể dùng cho cả đồ thị có hướng và vô
hướng hoặc từng dạng đồ thị cụ thể.
+ Đồ thị có trọng số Đồ thị G = (V,E) là đồ thị có trọng số nếu xây dựng một
đơn ánh từ E đến R gán cho mỗi cạnh thuộc E một số thực đặc trưng cho cạnh
đó và được gọi là trọng số của cạnh.
+ Cạnh
Nếu (u, v) là một cặp đỉnh thuộc E thì nói có một cạnh nối u và v. Khi đó
v được gọi là kề của u.
▪ Nếu G là đồ thị vô hướng, cạnh (u,v) được gọi là liên thuộc với
hai đỉnh u và v.
▪ Nếu G là đồ thị có hướng, cạnh (u,v) được gọi là đi ra từ đỉnh u
và đi vào đỉnh v.
+ Bậc của đỉnh
Gọi bậc của đỉnh trong đồ thị vô hướng là số cạnh liên thuộc với nó và

kí hiệu là deg(v).
Định lý
Tổng bậc tất cả các đỉnh trên đồ thị vô hướng bằng hai lần số cạnh của
đồ thị đó:
∑deg(v) = 2m.
Hệ quả
Trên đồ thị vô hướng, số đỉnh bậc lẻ là một số chẵn.
+ Bán bậc của đỉnh
Gọi bán bậc ra (vào) của đỉnh trong đồ thị có hướng là số cạnh của đồ
thị đi ra (vào) đỉnh đó và kí hiệu là deg
+
(v) (deg
-
(v)).
Định lý
Trên đồ thị có hướng, tổng bán bậc ra của tất cả các đỉnh bằng tổng bán
7
vào của tất cả các đỉnh.
+ Đường đi
Một đường đi từ đỉnh u đến đỉnh v trên đồ thị G là một dãy đỉnh u, u
1
, u
2
,
, u
i
, v mà các cạnh (u, u
1
), (u
1

, u
2
), , (u
i
, v)

E.
+ i = số lượng cung trên đường đi được gọi là độ dài của đường đi.
+ Đường đi đơn
Một đường đi đơn trên đồ thị là một đường đi mà trên đó không có cạnh
nào lặp lại.
+ Chu trình
Một chu trình trên đồ thị G là một đường đi đơn có đỉnh đầu và đỉnh
cuối trùng nhau.
+ Hai đỉnh liên thông
Đỉnh p và q được gọi là liên thông với nhau trên đồ thị G nếu có một
đường đi từ p đến q trên đồ thị đó.
+ Đồ thị liên thông
Một đồ thị được gọi là liên thông nếu mọi cặp đỉnh của đồ thị đều liên
thông.
+ Đồ thị con
Đồ thị H = (W,F) được gọi là đồ thị con của đồ thị G = (V,E) nếu W


V và F

E.
+ Thành phần liên thông
Đồ thị G không liên thông sẽ phân rã thành một số hữu hạn đồ thị con
liên thông đôi một không có đỉnh chung. Các đồ thị con này được gọi là các

thành phần liên thông của đồ thị.
+ Đỉnh rẽ nhánh
Đỉnh u được gọi là đỉnh rẽ nhánh của đồ thị G nếu việc loại bỏ đỉnh đó
cùng các cạnh liên thuộc với nó làm tăng số thành phần liên thông của đồ thị.
8
+ Cầu
Cạnh e được gọi là cầu của đồ thị G nếu việc loại bỏ cạnh đó làm tăng
số thành phần liên thông của đồ thị.
+ Đồ thị đẳng cấu
Hai đồ thị G
1
= (V
1
,E
1
) và G
2
= (V
2
,E
2
) được gọi là đồng cấu nếu tồn tại
một song ánh f: V
1
→ V
2
sao cho (u,v)

E
1

khi và chỉ khi (f(u),f(v))

E
2
.
1.2. Biểu diễn đồ thị
1.2.1. Ma trận kề
- Cách biểu diễn đồ thị bằng ma trận kề:
+ Đánh số các đỉnh thuộc V từ 1 → n.
+ Ma trận kề A biểu diễn G là một ma trận vuông nxn có các phần
tử nhận giá trị 0 hoặc 1: a
ij
= 1 nếu tồn tại một cung định hướng từ v
i
đến v
j
.
- Cách biểu diễn bằng ma trận kề có thể dùng cho cả đồ thị có hướng và
vô hướng. Dễ thấy ma trận biểu diễn đồ thị vô hướng đối xứng qua đường chéo
chính.
- Nếu đồ thị là có trọng số thì các phần tử ma trận kề có thể nhận giá trị
là trọng số của cung.
- Có thể lựa chọn hai giá trị 0 và 1 để phân biệt sự khác nhau giữa cặp
đỉnh có cạnh nối và cặp đỉnh không có cạnh nối. Trong thực tế cài đặt, tùy
thuộc vào thuật toán mà có thể sử dụng các bộ giá trị khác vẫn đảm bảo sự phân
biệt.
- Ưu điểm:
+ Tốc độ truy xuất thông tin về cạnh cao.
- Nhược điểm:
+ Đồ thị thưa có hiệu suất sử dụng tài nguyên thấp.

+ Tình huống cập nhật đồ thị bằng thao tác thay đổi kích thước tập
đỉnh rất phức tạp: buộc phải khai báo một ma trận với kích thước mới và hủy
bỏ ma trận đã sử dụng ban đầu.
9
1.2.2. Ma trận liên thuộc
- Cách biểu diễn đồ thị bằng ma trận liên thuộc:
+ Đánh số các đỉnh thuộc V từ 1 → n.
+ Đánh số các cạnh thuộc E từ 1 → m.
+ Ma trận liên thuộc A biểu diễn G là một ma trận nxm có các
phần tử nhận giá trị 0, 1 hoặc -1:
i. a
ij
= 1 nếu đỉnh i là đỉnh đầu của cạnh e
j
.
ii. a
ij
= -1 nếu đỉnh i là đỉnh cuối của cạnh e
j
.
iii. a
ij
= 0 nếu đỉnh i không là đầu mút của cạnh e
j
.
- Cách biểu diễn bằng ma trận liên thuộc chủ yếu được dùng để biểu diễn
đồ thị có hướng.
- Có thể lựa chọn ba giá trị 0, 1 và -1 để phân biệt sự khác nhau giữa đỉnh
i và cạnh e
j

. Trong thực tế cài đặt, tùy thuộc vào thuật toán mà có thể sử dụng
các bộ giá trị khác vẫn đảm bảo sự phân biệt.
- Ưu điểm:
+ Tốc độ truy xuất thông tin về cạnh nhanh.
+ Các cạnh được sắp xếp tuyến tính hỗ trợ tốt cho các thuật toán
yêu cầu quá trình duyệt lần lượt các cạnh.
- Nhược điểm:
+ Tài nguyên bộ nhớ quá tốn kém.
+ Tình huống cập nhật đồ thị bằng thao tác thay đổi kích thước tập
đỉnh hoặc tập cạnh rất phức tạp: buộc phải khai báo một ma trận với kích thước
mới và hủy bỏ ma trận đã sử dụng ban đầu.
1.2.3. Danh sách cạnh
- Cách biểu diễn đồ thị bằng danh sách cạnh:
+ Đánh số các đỉnh thuộc V từ 1 → n.
+ Đánh số các cạnh thuộc E từ 1 → m.
10
+ Thực hiện lưu trữ đồ thị G bằng cách lưu trữ thông tin về các
cạnh: đỉnh đầu, đỉnh cuối và trọng số(nếu có).
- Danh sách sử dụng để lưu trữ có thể là danh sách tuyến tính (sử dụng
cấu trúc mảng) hoặc danh sách liên kết.
- Ưu điểm:
+ Sử dụng tối ưu tài nguyên bộ nhớ.
- Nhược điểm:
+ Thao tác truy xuất thông tin về cạnh phức tạp: phải duyệt tất cả
các cạnh để tìm ra các đỉnh kề với một đỉnh đang xét.
1.2.4. Danh sách kề
- Cách biểu diễn đồ thị bằng danh sách kề
+ Đánh số các đỉnh thuộc V từ 1 → n.
+ Danh sách L biểu diễn G là một tập gồm n danh sách liên kết.
+ Danh sách thứ i trong L chứa các đỉnh kề với đỉnh i của đồ thị.

- Đối với đồ thị vô hướng, khi cài đặt nên lưu trữ danh sách theo qui
cách: các đỉnh trong danh sách sẽ có số thứ tự lớn hơn đỉnh tương ứng với danh
sách đó. Qui cách này sẽ giúp đảm bảo việc số ô nhớ dùng để lưu trữ đúng bằng
số cạnh của đồ thị mà không bị mất mát thông tin.
- Ưu điểm:
+ Sử dụng tối ưu tài nguyên bộ nhớ.
- Nhược điểm:
+ Thao tác truy xuất thông tin về cạnh phức tạp: xét danh sách
tương ứng với một đầu mút của cạnh và đầu mút còn lại có thuộc danh sách này
không.
1.3. Đồ thị phẳng
1.3.1. Khái niệm
Đồ thị phẳng
Đồ thị phẳng là đồ thị có thể được biểu diễn trên mặt phẳng sao cho các
11
cạnh không cắt nhau ở ngoài đỉnh.
Hình 1.3. Đồ thị phẳng
1.3.2. Công thức EULER
- G là đồ thị phẳng liên thông với n đỉnh và m cạnh. Gọi r là số miền của
mặt phẳng bị chia bởi biểu diễn phẳng của G. Khi đó ta có: r = m – n + 2.
1.3.3. Định lí Kuratowski
- Đồ thị là phẳng khi và chỉ khi nó không chứa đồ thị con đồng cấu với
K
3,3
hoặc K
5
.
12
1
3

2 4
CHƯƠNG 2: CÁC BÀI TOÁN VỀ ĐƯỜNG ĐI
2.1. Đồ thị Euler
2.1.1. Khái niệm
+ Đường đi và 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. Đường đi Euler có đỉnh đầu và đỉnh cuối trùng nhau gọi là
chu trình Euler.
+ Đồ thị Euler và nửa Euler
Đồ thị có chu trình Euler được gọi là đồ thị Euler. Đồ thị có đường đi
Euler được gọi là đồ thị nửa Euler.
Định lý 1
Đồ thị vô hướng G là đồ thị Euler khi và chỉ khi mọi đỉnh của G đều có
bậc chẵn.
Định lý 2
Đồ thị vô hướng G là đồ thị nửa Euler khi và chỉ khi G có không quá hai
đỉnh bậc lẻ.
13
13
2
5
4
13
2
5
4
Chu trình Euler:
1 → 4 → 2 → 5 → 4 → 3 → 1
Đường đi Euler:
1 → 4 → 5 → 2 → 3 → 5 → 1 → 3

Hình 2.1. Đồ thị Euler và nửa Euler
2.1.2. Thuật toán tìm chu trình Euler
- Cho đồ thị Euler G = (V,E) được biểu diễn bởi danh sách kề ke(u).
- Trong quá trình thực hiện thuật toán sử dụng STACK để lưu các đỉnh
đang xét và CE để lưu chu trình Euler được xây dựng.
- Giả mã thuật toán xây dựng chu trình Euler trên đồ thị G:
Giả mã 2.2. BUILD_EULER_CYCLE
- Thuật toán bằng tay xác định chu trình Euler trên đồ thị Euler: xuất phát
từ 1 đỉnh u nào đó của đồ thị Euler G, ta đi theo các cạnh của nó một cách tùy ý
nhưng tuân thủ 2 qui tắc sau:
+ Xóa bỏ cạnh đã đi qua và xóa những đỉnh cô lập được tạo thành.
14
procedure BUILD_EULER_CYCLE
begin
STACK := Ø;
CE := Ø;
chọn u là một đỉnh nào đó;
STACK ← u;
while STACK != Ø do
begin
x ← STACK;
if ke(x) != Ø then
begin
y := đỉnh đầu của ke(x);
STACK ← y;
ke(x) := ke(x) \ {y};
ke(y) := ke(y) \ {x};
end
else
begin

x ← STACK;
CE ← x;
end
end
end
+ Ở mỗi bước chỉ đi qua cầu khi không còn lựa chọn nào khác.
2.2. Tìm đường đi trong mê cung
2.2.1. Bài toán
- Cho một mê cung kích thước n x m gồm các ô chứa các số 0, 1. Một ô
có thể đi sang ô kề nó nếu hai ô có chung trọng số. Tìm đường từ vị trí (x1,y1)
đến (x2,y2) gồm các ô liền kề không lặp lại.
- Input là file input.txt với dòng đầu ghi n m k, k là số ô chứa số 1. Sau
đó là k dòng ghi tọa độ x y của các ô chứa số 1. Cuối cùng là 2 dòng ghi tọa độ
x1 y1 x2 y2 của điểm xuất phát và đích.
2.2.2. Thuật toán
- Thuật toán có thể được xây dựng dựa trên tư tưởng của thuật toán duyệt
theo chiều sâu hoặc theo chiều rộng.
2.2.2.1. Thuật toán loang
- Thuật toán loang dựa trên ý tưởng của thuật toán tìm kiếm theo chiều
rộng.
- Ý tưởng của thuật toán: đầu tiên, đánh dấu ô (x1,y1) là có thể đến. Mỗi
bước ta mở rộng vùng có thể đến được ra xung quanh một lượt ô bằng cách
đánh dấu có thể đến cho tất cả các ô có thể đi sang từ một ô có thể đến. Việc
mở rộng được lặp đi lặp lại tới khi ô đích (x2,y2) được đánh dấu có thể đến.
2.2.2.2. Thuật toán thử - quay lui
- Thuật toán thử - quay lui dựa trên ý tưởng của thuật toán tìm kiếm theo
chiều sâu.
- Ý tưởng của thuật toán: đánh dấu ô (x1,y1). Đi theo một đường bất kì,
nếu gặp một điểm giao nhau của nhiều đường, đánh dấu lại điểm giao nhau đó.
Khi gặp đường cụt, quay lại điểm giao nhau gần nhất đã đánh dấu và đánh dấu

đường vừa đi là đường cụt. Một điểm giao nhau được đánh dấu là cụt nếu mọi
đường đi từ nó đều là đường cụt. Đi lần lượt tất cả các con đường tới khi gặp
được ô đích.
15
2.3. Tìm đường đi ngắn nhất
2.3.1. Phát biểu bài toán
- Cho đồ thị có hướng có trọng số liên thông G = (V,E) với V = {1, 2, ,
n} và tập E gồm m cạnh có trọng số c(e). Bài toán tìm đường đi ngắn nhất trên
đồ thị được phát biểu như sau: tìm đường đi ngắn nhất từ đỉnh xuất phát s đến
đỉnh t trên đồ thị G.
- Ta có giả mã thuật toán Ford Bellman tìm đường đi ngắn nhất từ một
đỉnh s đến tất cả các đỉnh còn lại của một đồ thị bất kì:
Giả mã 2.3. FORD_BELLMAN
2.3.2. Thuật toán Dijkstra
- Thuật toán Dijkstra tìm đường đi ngắn nhất từ một đỉnh s đến tất cả các
đỉnh còn lại của đồ thị trọng số không âm.
16
procedure FORD_BELLMAN
begin
for v

V do
begin
d[v] := c[s,v];
truoc[v] := s;
end
d[s] := 0;
for k := 1 to n-2 do
for v


V\{s} do
for u

V do
if d[v] > d[u] + a[u,v] then
begin
d[v] := d[u] + a[u,v];
truoc[v] := u;
end
end
- Ta có giả mã thuật toán Dijkstra:
Giả mã 2.4. PATH_FINDING_DIJKSTRA
- Trong quá trình thực hiện thuật toán, ta sử dụng hai nhãn cho các đỉnh
của đồ thị:
+ d[u]: tổng trọng số đường đi ngắn nhất hiện tại từ đỉnh s đến
đỉnh u.
+ truoc[u]: đỉnh kề trước trên đường đi ngắn nhất hiện tại từ đỉnh s
đến đỉnh u.
Mỗi bước thực hiện thuật toán, ta cập nhật các nhãn tạm thời d[u] và
truoc[u] bằng điều kiện:
nếu d[v] > d[u] + c[u,v] thì d[v] = d[u] + c[u,v]
- T là tập các đỉnh đã có nhãn chưa cố định: đường đi ngắn nhất hiện tại
từ s đến u

V\T chính là đường đi ngắn nhất từ s đến u.
17
procedure PATH_FINDING_DIJKSTRA
begin
for v


V do
begin
d[v] := c[s,v];
truoc[v] := s;
end
d[s] := 0;
T := V\{s};
while T != Ø do
begin
tìm u

T sao cho d[u] = min{d[z]|z

T}
T := T\{u};
for v

T do
if d[v] > d[u] + c[u,v] then
begin
d[v] = d[u] + c[u,v]
truoc[v] := u;
end
end
end
- Thuật toán Dijkstra có độ phức tạp O(n
2
).
- Hình minh họa quá trình thực hiện thuật toán Dijkstra tìm đường đi
ngắn nhất từ đỉnh 1 tới tất cả các đỉnh còn lại: các cặp đỉnh u và v không tồn tại

cạnh nối sẽ có trọng số c[u,v] =

Hình 2.5. Cập nhật nhãn trong quá trình thực hiện thuật toán Dijkstra
2.3.2. Thuật toán Floyd
- Thuật toán Floyd tìm đường đi giữa tất cả các cặp đỉnh của đồ thị
- Đầu ra của thuật toán:
+ d[i,j]: độ dài đường đi ngắn nhất từ i → j.
+ p[i,j]: đỉnh kề trước đỉnh j trên đường đi ngắn nhất hiện tại từ
đỉnh i đến đỉnh j.
- Thuật toán Floyd có độ phức tạp O(n
3
).
18
1
4
2
6
7
26
5
18
8
3
14
10
16
3
5
2
30

4
12
Đỉnh 1Đỉnh 2Đỉnh 3Đỉnh 4Đỉnh 5Đỉnh 6Đỉnh 7T0, 18, 1*∞, 1∞, 1∞, 1∞,
1∞, 12, 3, 4, 5, 6, 7 26, 2∞, 1∞, 118, 210, 2*3, 4, 5, 6, 7 22, 724, 7∞, 113,
7*-3, 4, 5, 6 22, 7*24, 729, 6 3, 4, 5 24, 7*29, 6 29, 6*
- Ta có giả mã thuật toán Floyd:
Giả mã 2.6. PATH_FINDING_FLOYD
2.4. Đồ thị Hamilton
2.4.1. Khái niệm
+ Đường đi và chu trình Hamilton
Đường đi trong G đi qua mỗi đỉnh của nó một lần được gọi là đường đi
Hamilton. Đường đi Hamilton có đỉnh đầu và đỉnh cuối trùng nhau gọi là chu
trình Hamilton.
+ Đồ thị Hamilton và nửa Hamilton
Đồ thị có chu trình Hamilton được gọi là đồ thị Hamilton. Đồ thị có
đường đi Hamilton được gọi là đồ thị nửa Hamilton.
Định lý 1.
Đồ thị vô hướng G có các đỉnh có bậc không nhỏ hơn n/2 là đô thị
Hamilton.
Định lý 2.
Đồ thị có hướng liên thông mạnh G có các đỉnh có bán bậc ra và bán
19
for k:= 1 to n do
for i:= 1 to n do
for j:= 1 to n do
if d[i,j] > d[i,k] + d[k,j] then
begin
d[i,j] := d[i,k] + d[k,j];
p[i,j] := p[k,j];
end

end
procedure PATH_FINDING_FLOYD
begin
for i:= 1 to n do
for j:= 1 to n do
begin
d[i,j] := c[i,j];
p[i,j] := i;
end
bậc vào không nhỏ hơn n/2 là đồ thị Hamilton.
20
Hình 2.7. Đồ thị Hamilton và nửa Hamilton
2.4.2. Thuật toán tìm chu trình Hamilton
- Cho đồ thị Euler G = (V,E) được biểu diễn bởi danh sách kề ke(u).
- Ta có giả mã thuật toán xây dựng tất cả các chu trình Hamilton trên đồ
thị G:
Giả mã 2.8. BUILD_HAMILTON_CYCLE
21
13
2
5
13
5
4
Chu trình Hamilton:
1 → 3 → 2 → 5 → 1
Đường đi Hamilton:
3 → 5 →1 → 4
procedure BUILD_HAMILTON_CYCLE(k)
begin

for y

ke(x[k-1]) do
if (k = n+1)and(y = v0)
then ghinhan(x[1], ,x[n],v0)
else
if chuaxet[y] then
begin
x[k] := y;
chuaxet[y] := false;
hamilton(k+1);
chuaxet[y] := true;
end
end
2.4.3. Mã Gray
+ Mã Gray
Mã Gray, hay còn gọi là mã nhị phân phản xạ, là một hệ thống ký số nhị
phân, trong đó hai giá trị liên tiếp chỉ khác nhau một chữ số.
Ví dụ mã Gray: n=3
{(0,0,0),(0,0,1),(0,1,1),(0,1,0),(1,1,0),(1,1,1),(1,0,1),(1,0,0)}
+ Xét trên không gian vector n chiều, với mỗi chiều chỉ nhận một trong hai giá
trị nhị phân 0 hoặc 1: có tổng cộng 2
n
vector khác nhau, mỗi vector được biểu
diễn bằng một đỉnh của một đơn đồ thị vô hướng G. Hai vector (đỉnh đồ thị) có
thể đi đến với nhau nếu chúng chỉ sai khác một bit duy nhất. Khi đó, mã Gray
sẽ cho ta một chu trình Hamilton trên đồ thị G đã cho.
+ Xây dựng mã Gray: ta có hình vẽ sau minh họa quá trình xây dựng mã Gray:
Hình 2.9. Xây dựng mã Gray
22

CHƯƠNG 3: CÂY
3.1. Khái niệm cây
+ Khái niệm 1
Cây là đơn đồ thị vô hướng liên thông không có chu trình.
+ Khái niệm 2
Ta có định nghĩa cây được trình bày đệ qui như sau:
+ Một nút là một cây. Nút đó cũng là gốc của cây ấy.
+ Nếu T
1
, T
2
, , T
k
là các cây đôi một phân biệt, với n
1
, n
2
, , n
k
lần lượt là các gốc, n là một nút và n có quan hệ cha – con với n
1
,
n
2
, , n
k
thì lúc đó một cây mới sẽ được tạo lập, với n là gốc của
cây đó.
- Khi đó n được gọi là cha của n
1

, n
2
, , n
k
; ngược lại n
1
, n
2
, , n
k
được
gọi là con của n. Các cây T
1
, T
2
, , T
k
được gọi là cây con của cây T.
- Dễ thấy sự đồng nhất của hai khái niệm: ta sẽ chứng minh cây được nêu
ra ở khái niệm 2 sẽ thỏa mãn hai tính chất của cây được đề cập ở khái niệm 1:
+ Cây là đơn đồ thị liên thông: chúng ta chứng minh theo tư tưởng qui
nạp: giả sử các cây T
1
, T
2
, , T
k
đều là các đồ thị liên thông. Xét hai đỉnh u, v
bất kì thuộc hai cây T
i

và T
j
, khi đó do T
i
và T
j
là hai đồ thị liên thông nên tồn
tại đường đi từ u đến n
i
và từ n
j
đến v. Trên cây T, n lại là nút cha của các nút
n
1
, n
2
, , n
k
; do đó tồn tại cạnh nối n với n
1
và n với n
2
. Vậy: đường đi giữa hai
đỉnh u và v bất kì trên cây T sẽ là u, , n
i
, n, n
j
, , v.
- Khái niệm 1 và khái niệm 2 khác nhau ở điểm: khái niệm 2 quan tâm
tới nút nào là gốc của cây; còn khái niệm 1 thì không. Khi đã xác định được nút

gốc của cây, chúng ta mới quan tâm tới quan hệ cha – con và các quan hệ suy
diễn giữa các nút trong cây. Khái niệm 1 nhìn nhận cây dưới góc độ một dạng
đồ thị đặc biệt, và do đó quan tâm tới các tính chất đặc biệt của đồ thị đó.
3.2. Tính chất của cây
- Giả sử T = (V,E) là đơn đồ thị vô hướng n đỉnh. Các mệnh đề sau đây
là tương đương:
23
i. T là cây, tức là T liên thông và không có chu trình.
ii. T không chứa chu trình và có n-1 cạnh.
iii. T liên thông và có n-1 cạnh.
iv. T liên thông và mỗi cạnh của nó đều là cầu.
v. Hai đỉnh bất kì của T được nối với nhau bởi đúng một đường đi đơn.
vi. T không chứa chu trình nhưng hễ cứ thêm vào nó một cạnh ta thu
được đúng một chu trình.
- Chúng ta chứng minh các tính chất của cây theo thứ tự: i → ii → iii →
iv → v → vi → i:
(i → ii). Theo khái niệm 3.1.1. thì cây không chứa chu trình. Ta sẽ chứng minh
theo ý tưởng qui nạp: cây có n đỉnh thì có n-1 cạnh. Thực vậy: với hai đỉnh, ta
chỉ xây dựng được duy nhất một cây có một cạnh. Giả sử: cây có n-1 đỉnh sẽ có
n-2 cạnh. Trên một cây có n đỉnh bất kì, ta xét đường đi dài nhất giữa hai đỉnh
bất kì trên cây. Khi đó đỉnh đầu và đỉnh cuối của đường đi sẽ là lá, vì nếu
không là lá thì đường đi đó có thể được kéo dài dẫn tới đường đi đang xét
không thỏa mãn là đường đi dài nhất. Loại bỏ một đỉnh lá và cạnh duy nhất nối
nó với đỉnh kề nó, chúng ta thu được cây có n-1 đỉnh và n-2 cạnh. Do vậy cây
có n đỉnh ban đầu sẽ có n-2 + 1 = n-1 cạnh, chính là điều phải chứng minh.
(ii → iii). Theo ii, T có n-1 cạnh. Ta chứng minh T liên thông theo ý tưởng
phản chứng. Giả sử T không liên thông, khi đó T phân rã thành k thành phần
con liên thông T
1
, T

2
, , T
k
với số đỉnh và số cạnh của cây T
i
là n
i
và e
i
. Vì T
không chứa chu trình nên T
i
cũng không chứa chu trình. T
i
liên thông và không
chứa chu trình nên theo i thì T
i
là cây, suy ra e
i
= n
i
- 1 với mọi 1 ≤ i ≤ k. Khi
đó, số cạnh của cây T bằng tổng số cạnh của tất cả các thành phần con T
i
:
e
T
= ∑e
i
= ∑(n

i
- 1) = ∑n
i
- k = n - k < n-1
trái với giả thiết ii cung cấp: T có n-1 cạnh. Vậy ta có điều phải chứng minh.
(iii → iv). Theo iii, T liên thông. Ngoài ra, khi loại bỏ một cạnh bất kì trên cây,
chúng ta có một đồ thị có n đỉnh và n-2 cạnh. Nếu loại bỏ đỉnh lá và cạnh kề
với nó khỏi cây, chúng ta sẽ thu được đồ thị con có tính liên thông giống đồ thị
24
ban đầu và số cạnh cũng như số đỉnh giảm đi một. Lặp lại thao tác này, ta thu
được đồ thị gồm hai đỉnh và không có cạnh nào, là đồ thị không liên thông, do
đó đồ thị gồm n đỉnh và n-2 cạnh là không liên thông. Vậy mọi cạnh trong cây
đều là cầu, ta có điều phải chứng minh.
(iv → v). Theo iv, T liên thông nên giữa mọi cặp đỉnh của nó đều có đường đi.
Ta chứng minh sự tồn tại duy nhất của đường đi nối hai đỉnh bất kì theo ý
tưởng qui nạp: nếu giữa một cặp đỉnh có hai đường đi, ta xét đồ thị con của T
chỉ gồm các đỉnh và các cạnh thuộc hai đường đi trên. Trên đồ thị con này sẽ
tồn tại đỉnh có hai đỉnh kề thuộc hai đường đi khác nhau, và do đó trong các
cạnh kề với đỉnh này sẽ có cạnh không phải là cầu, trái với giả thiết iv cung
cấp. Do đó ta có điều phải chứng minh.
(v → vi). Vẫn theo ý tưởng phản chứng: nếu T chứa chu trình thì sẽ có hai
đường đi nối hai đỉnh bất kì thuộc chu trình đó, vi phạm giả thuyết do v cung
cấp. Do đó T không chứa chu trình. Ngoài ra, nếu thêm vào cạnh nối hai đỉnh u
và v trên T, cạnh này sẽ hợp với đường đi nối u với v trên T thành một chu
trình. Do đường đi đơn giữa u và v là duy nhất nên chỉ thu được một chu trình.
Vậy ta có điều phải chứng minh.
(vi → i). vi đã cung cấp: T không chứa chu trình. Ngoài ra, theo ý tưởng phản
chứng, giả sử T không liên thông. Khi đó T phân rã thành ít nhất hai thành phần
liên thông. Nếu thêm một cạnh nối hai đỉnh bất kì thuộc hai thành phần liên
thông khác nhau, chúng ta không thu được chu trình nào do giữa hai đỉnh này

không tồn tại đường đi. Do đó, T là liên thông, ta có điều phải chứng minh.
3.3. Các khái niệm liên quan
+ Rừng
Đồ thị không có chu trình được gọi là rừng. Suy ra rừng là một tập hữu
hạn các cây đôi một phân biệt.
+ Cấp của nút
Số các con của một nút gọi là cấp của nút đó.
+ Nút cấp 0 được gọi là nút lá.
+ Nút không là lá được gọi là nút nhánh.
25

×