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

một số bài toán tối ưu tổ hợp trên đồ 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 (1.15 MB, 67 trang )

ĐẠI HỌC THÁI NGUYÊN
TRƯỜNG ĐẠI HỌC KHOA HỌC
ĐOÀN NGỌC LÀNH
MỘT SỐ BÀI TOÁN
TỐI ƯU TỔ HỢP TRÊN ĐỒ THỊ
LUẬN VĂN THẠC SĨ TOÁN HỌC
Thái Nguyên - 2012
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
ĐẠI HỌC THÁI NGUYÊN
TRƯỜNG ĐẠI HỌC KHOA HỌC
ĐOÀN NGỌC LÀNH
MỘT SỐ BÀI TOÁN
TỐI ƯU TỔ HỢP TRÊN ĐỒ THỊ
Chuyên ngành: TOÁN ỨNG DỤNG
Mã số : 60.46.36
LUẬN VĂN THẠC SĨ TOÁN HỌC
Người hướng dẫn khoa học: TS VŨ MẠNH XUÂN
Thái Nguyên - 2012
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
Mục lục
Mở đầu 3
1 Tối ưu tổ hợp 5
1.1 Thuật toán và độ phức tạp của thuật toán . . . . . . . . . 5
1.1.1 Thuật toán . . . . . . . . . . . . . . . . . . . . . . . 5
1.1.2 Độ phức tạp của thuật toán . . . . . . . . . . . . . 7
1.1.3 Đánh giá thời gian tốt nhất, tồi nhất và trung bình
của một thuật toán . . . . . . . . . . . . . . . . . . 10
1.2 Tối ưu tổ hợp . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.2.1 Bài toán tối ưu tổ hợp . . . . . . . . . . . . . . . . 13
1.2.2 Một số bài toán cụ thể . . . . . . . . . . . . . . . . 14
1.2.3 Bài toán lớp P và lớp NP . . . . . . . . . . . . . . 16


2 Một số bài toán tối ưu tổ hợp trên đồ thị 18
2.1 Một số khái niệm . . . . . . . . . . . . . . . . . . . . . . . 18
2.1.1 Đồ thị vô hướng . . . . . . . . . . . . . . . . . . . . 18
2.1.2 Đồ thị có hướng . . . . . . . . . . . . . . . . . . . . 19
2.1.3 Đường đi, chu trình. Đồ thị liên thông . . . . . . . . 20
2.2 Thuật toán tìm kiếm trên đồ thị . . . . . . . . . . . . . . . 22
2.2.1 Thuật toán tìm kiếm theo chiều sâu trên đồ thị . . . 22
2.2.2 Tìm kiếm theo chiều rộng trên đồ thị . . . . . . . . 25
2.3 Bài toán đường đi ngắn nhất . . . . . . . . . . . . . . . . . 29
2.3.1 Đường đi ngắn nhất xuất phát từ một đỉnh đến các
đỉnh còn lại_Thuật toán Dijkstra . . . . . . . . . . 31
2.3.2 Đường đi ngắn nhất giữa tất cả các cặp đỉnh_Thuật
toán Floyd . . . . . . . . . . . . . . . . . . . . . . . 37
2.4 Bài toán luồng cực đại trong mạng và ứng dụng . . . . . . . 41
2.4.1 Mạng. Luồng trong mạng. Bài toán luồng cực đại . . 41
1
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
2.4.2 Lát cắt. Đường tăng luồng. Định lí Ford - Fulkerson 43
2.4.3 Thuật toán tìm luồng cực đại trong mạng . . . . . . 46
2.4.4 Một số bài toán luồng tổng quát . . . . . . . . . . . 54
2.4.5 Một số ứng dụng trong tổ hợp từ bài toán luồng . . 57
Kết luận 64
Tài liệu tham khảo 65
2
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
Mở đầu
Lý thuyết đồ thị là một lĩnh vực nghiên cứu có ý nghĩa thực tiễn cao
đã bắt đầu từ lâu. Tuy nhiên, do việc tính toán trên đồ thị thường là cần
khối lượng tính toán cũng như không gian nhớ lớn, vì vậy gần đây cùng
với sự phát triển mạnh mẽ của kỹ thuật máy tính điện tử, các bài toán tối

ưu trên đồ thị ngày càng được quan tâm và đã đạt được nhiều kết quả khả
quan. Đáng chú ý, việc chứng minh giả thuyết bốn màu có thể xem như
một minh chứng rõ nét về việc chứng minh bài toán nhờ máy tính điện
tử. Mặc dù có ý nghĩa thực tiễn cao nhưng lý thuyết đồ thị cũng chỉ mới
được đưa vào chương trình giảng dạy và nói chung còn sơ sài. Đề tài này
đặt vấn đề nghiên cứu những vấn đề cơ bản về thuật toán, độ phức tạp
thuật toán, m ột số bài toán tối ưu cụ thể trên đồ thị và trình bày thuật
toán cũng như kết quả tính toán với những bài toán cụ thể.
Nội dung của bản Luận văn gồm 2 chương.
Chương 1 trình bày khái quát về thuật toán, độ phức tạp của thuật
toán, nêu một số bài toán có độ phức tạp đa thức và không đa thức.
Chương 2 trình bày một số thuật toán giải một lớp những bài toán:
duyệt đồ thị, bài toán tìm đường đi ngắn nhất, bài toán luồng cực đại
và minh họa trên những ví dụ cụ thể.
Dù đã rất cố gắng, nhưng chắc chắn nội dung được trình bày trong luận
văn không tránh khỏi thiếu sót nhất định, em rất mong nhận được sự góp
ý của các thầy cô giáo và các bạn.
Luận văn này được hoàn thành dưới sự chỉ bảo và hướng dẫn tận tình
của TS Vũ Mạnh Xuân. Thầy đã dành nhiều thời gian hướng dẫn và giải
đáp các thắc mắc của tôi trong suốt quá trình làm luận văn. Em xin được
bày tỏ lòng biết ơn sâu sắc đến Thầy.
Tôi xin cảm ơn Sở Nội vụ, Sở Giáo dục và Đào tạo Tuyên Quang, trường
THPT Xuân Vân, Tổ Toán trường THPT Xuân Vân đã giúp đỡ tạo điều
kiện cho tôi hoàn thành khóa học này.
3
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
Em xin gửi tới các thầy cô khoa Toán, phòng đào tạo sau đại học Trường
Đại học Khoa Học, Đại học Thái Nguyên cũng như các Thầy cô đã tham
gia giảng dạy khóa cao học 2010 - 2012, lời cảm ơn sâu sắc nhất về công
lao dạy dỗ trong suốt quá trình giáo dục, đào tạo của Nhà trường.

Thái Nguyên, ngày 15 tháng 7 năm 2012
Người thực hiện
Đoàn Ngọc Lành
4
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
Chương 1
Tối ưu tổ hợp
Chương này trình bày về lớp bài toán tối ưu tổ hợp, thuật toán và mô tả
thuật toán bằng ngôn ngữ tựa Passcal, đánh giá độ phức tạp của thuật
toán. Nêu một số bài toán cụ thể thuộc lớp bài toán tối ưu tổ hợp, từ đó
đưa ra khái niệm bài toán lớp P và lớp NP.
1.1 Thuật toán và độ phức tạp của thuật toán
1.1.1 Thuật toán
Khái niệm thuật toán bắt đầu từ thuật ngữ “Algorithm” (thuật toán) là tên
nhà toán học Arập: Aba Ja’fa Mohamedibn Musaal Khowarizmi, người đã
viết cuốn sách về các chữ số Hindu - cơ sở của kí hiệu số thập phân hiện
đại. Ban đầu từ algorism được dùng để chỉ các quy tắc thực hiện các phép
tính số học với các con số được viết trên hệ thập phân. Sau đó, Algorism
chuyển thành Algorithm vào thế kỷ XIX. Với sự quan tâm ngày càng tăng
đối với các máy tính, khái niệm thuật toán đã được định nghĩa một cách
hình thức chính xác thông qua máy Turing. Tuy nhiên trong Luận văn này
khái niệm thuật toán được hiểu trực quan như sau.
Định nghĩa 1.1.1. Thuật toán để giải một bài toán (P) là một thủ tục
xác định, được chia ra thành các phép toán cơ bản, biến đổi một dãy các
dấu hiệu diễn tả các dữ liệu, không quan trọng ở chỗ thuộc bản chất gì
của bài toán (P) thành một dãy các dấu hiệu đặc trưng cho các kết quả
của (P).
Thuật toán có những đặc trưng sau:
• Đầu vào (Input): Một thuật toán nhận các giá trị đầu vào từ một
tập hợp đã được chỉ rõ (tập đã xác định).

5
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
• Đầu ra (Output): Từ mỗi tập có các giá trị đầu vào, thuật toán sẽ
tạo ra các giá trị đầu ra tương ứng. Các giá trị đầu ra chính là nghiệm
(lời giải) của bài toán.
• Tính chính xác (Precision): Các bước của thuật toán phải được mô
tả chính xác. Ở mỗi bước, các thao tác phải hết sức rõ ràng, không
gây nên sự nhập nhằng, lộn xộn, tùy tiện, đa định nghĩa. Nói rõ hơn,
trong cùng một điều kiện hai bộ xử lý cùng thực hiện một bước của
thuật toán phải cho những kết quả như nhau.
• Tính hữu hạn hay tính dừng (Finiteness): Sau một số hữu hạn
bước thuật toán phải cho kết quả với mọi đầu vào.
• Tính đơn trị (Uniqueness): Các kết quả trung gian của từng bước
thực hiện thuật toán được xác định một cách đơn trị, chỉ phụ thuộc
đầu vào và các kết quả của các bước trước. Với hai bộ dữ liệu giống
nhau cho trước làm input, thuật toán đơn định sẽ thi hành các mã lệnh
giống nhau và cho kết quả giống nhau, còn thuật toán ngẫu nhiên có
thể thực hiện theo những mã lệnh khác nhau và cho kết quả khác
nhau.
• Tính tổng quát (Generality): Thuật toán có thể giải bất kỳ một bài
toán nào trong lớp các bài toán đang xét. Với thuật toán có đầu vào
là các bộ dữ liệu khác nhau trong một miền xác định thì có thể vận
dụng được thuật toán.
• Tính hiệu quả (The effectiveness): Hiệu quả về thời gian: Thuật
toán phải được thực hiện trong thời gian cho phép, điều này khác với
lời giải toán (chỉ cần chứng minh là kết thúc sau hữu hạn bước). Tính
hiệu quả về bộ nhớ: Kích thước của thuật toán phải đủ nhỏ để phù
hợp với khả năng lưu trữ.
Mô tả thuật toán: Có nhiều cách trình bày thuật toán, như dùng ngôn
ngữ tự nhiên, ngôn ngữ lưu đồ (sơ đồ khối), ngôn ngữ lập trình, ngôn ngữ

phỏng trình. Trong đề tài này các thuật toán được trình bày bằng ngôn
ngữ tựa Pascal, trong đó cho phép vừa mô tả thuật toán bằng ngôn ngữ
thông thường, vừa sử dụng những cấu trúc lệnh tương tự như của ngôn
ngữ lập trình Pascal.
6
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
Ví dụ 1.1.2. Mô tả thuật toán tìm phần tử lớn nhất trong một dãy hữu
hạn các số nguyên.
a) Dùng ngôn ngữ tự nhiên để mô tả các bước cần thực hiện.
1. Đặt giá trị cực đại tạm thời bằng số nguyên đầu tiên trong dãy. (Cực
đại tạm thời sẽ là số nguyên lớn nhất đã được kiểm tra ở một giai đoạn
nào đó của thủ tục.)
2. So sánh số nguyên tiếp sau với giá trị cực đại tạm thời, nếu nó lớn hơn
giá trị cực đại tạm thời thì đặt cực đại tạm thời bằng số nguyên đó.
3. Lặp lại bước trước nếu còn các số nguyên trong dãy.
4. Dừng khi không còn số nguyên nào nữa trong dãy. Cực đại tạm thời ở
điểm này chính là số nguyên lớn nhất của dãy.
b) Thuật toán mô tả tựa Passcal.
Input: Dãy gồm n số nguyên a
1
, a
2
, , a
n
Output: Max là số lớn nhất trong dãy.
Procedure Max(a
1
, a
2
, , a

n
: integer);
Begin
Max:= a
1
;
for i:= 2 to n do
(* Nếu a
i
lớn hơn Max thì gán lại Max *)
if Max < a
i
then Max := a
i
;
End;
Thuật toán này trước hết gán số hạng đầu tiên a
1
của dãy cho biến Max.
Vòng lặp for được dùng để kiểm tra lần lượt các số hạng của dãy. Nếu
một số hạng lớn hơn giá trị hiện thời của Max thì nó được gán làm giá
trị mới của Max.
1.1.2 Độ phức tạp của thuật toán
Để đánh giá khả năng ứng dụng của chương trình ta cần phân tích tính
hiệu quả của thuật toán. Phân tích thuật toán là quá trình tìm ra những
đánh giá về thời gian tính cũng như dung lượng bộ nhớ cần thiết để thực
hiện thuật toán. Để đo tính hiệu quả của một thuật toán đã cho, ta thiết
lập mối quan hệ giữa thời gian tiến hành thuật toán, được diễn tả bởi số
các phép toán cơ bản với kích thước của bài toán đang xét, hoặc được diễn
tả bởi số các dấu hiệu cần thiết để mã hóa các dữ liệu của bài toán.

Có ba câu hỏi được đặt ra khi đánh giá thuật toán:
7
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
1) Những phép toán cơ bản đang nói đến là những phép toán nào?
2) Bộ mã hóa nào của các dữ liệu cho phép ta đo kích thước của bài
toán?
3) Những hàm nào liên kết kích thước với số các phép toán cơ bản mà
có thể giúp ta nói rằng một thuật toán là hiệu quả?
Có thể cho rằng việc trả lời câu hỏi thứ ba cho phép ta trả lời hai câu hỏi
đầu.
Thước đo hiệu quả của một thuật toán là thời gian mà máy tính sử dụng
để giải bài toán theo thuật toán đang xét, khi các giá trị đầu vào có một
kích thước xác định. Một thước đo thứ hai là dung lượng bộ nhớ đòi hỏi
để thực hiện thuật toán khi các giá trị đầu vào có kích thước xác định.
Các vấn đề như thế liên quan đến độ phức tạp tính toán của một thuật
toán.
Định nghĩa 1.1.3. Độ phức tạp tính toán của một thuật toán là lượng
thời gian và bộ nhớ cần thiết để thực hiện thuật toán (ta gọi là thời gian
tính của thuật toán).
Vì việc xem xét độ phức tạp không gian gắn liền với các cấu trúc dữ liệu
đặc biệt được dùng để thực hiện thuật toán nên ở đây ta sẽ tập trung xem
xét độ phức tạp thời gian tính của thuật toán. Chúng ta sẽ quan tâm đến:
• Thời gian tính tốt nhất của thuật toán với đầu vào kích thức n, là thời
gian tối thiểu cần thiết để thực hiện thuật toán.
• Thời gian tính tồi nhất của thuật toán với đầu vào kích thước n, là
thời gian nhiều nhất cần thiết để thực hiện thuật toán.
• Thời gian tính trung bình của thuật toán, là thời gian trung bình cần
thiết để thực hiện thuật toán, trên tập hữu hạn các đầu vào kích thước
n.
Để tính toán thời gian tính của thuật toán ta sẽ đếm số câu lệnh mà nó

phải thực hiện, hoặc trong một số trường hợp cụ thể đếm số các phép tính
số học, so sánh, gán, mà thuật toán đòi hỏi thực hiện. Đây là tiêu chuẩn
khách quan để đánh giá tính hiệu quả của thuật toán.
Ví dụ 1.1.4. Kiểm tra số nguyên dương n có phải là nguyên tố không?
8
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
Phân tích. Số nguyên dương n là số nguyên tố khi và chỉ khi n > 1 và n
chỉ có hai ước là 1 và chính nó hay n>1 và n không chia hết cho k với
2 ≤ k ≤ n −1
Mô tả thuật toán tựa pascal:
Input: Nhập số nguyên n;
Output: n số nguyên tố hoặc hợp số.
Procedure Nguyento(n);
Begin
ok:=True;
For i:=2 to n-1 do
If (n mod i =0) then ok:=False;
If ok then n_nguyên_tố else n_hợp_số;
End;
Độ phức tạp của thuật toán cỡ n. Ví dụ n=10000 thì chương trình trên
phải duyệt 99998 lần.
Nhận xét: Nếu n có ước thì có một ước không lớn hơn
n
2
. Khi đó thuật
toán được mô tả như sau.
Procedure Nguyento(n);
Begin
ok:=True;
For i:=2 to (n div 2) do

If (n mod i =0) then ok:=False;
If ok then n_nguyên_tố else n_hợp_số;
End;
Độ phức tạp của thuật toán khi đó cỡ
n
2
. Ví dụ n=10000 thì chương trình
trên chỉ phải duyệt 5000 lần.
Nhận xét: Nếu n có ước thì n có một ước nguyên tố không vượt quá

n.
Khi đó thuật toán được mô tả như sau.
Procedure Nguyento(n);
Begin
ok:=True;
For i:=2 to trunc(sqrt(n)) do
If (nmodi = 0) then ok:=False;
If ok then n_nguyên_tố else n_hợp_số;
End;
9
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
Độ phức tạp của thuật toán khi đó cỡ

n. Ví dụ n=10000 thì chương trình
trên chỉ phải duyệt 100 lần.
Vậy ta thấy cùng một bài toán nhưng khi thay đổi điều kiện cho câu lệnh
(phép toán) thì độ phức tạp của thuật toán vẫn là đa thức nhưng đã có
thay đổi giảm đáng kể.
1.1.3 Đánh giá thời gian tốt nhất, tồi nhất và trung bình của một thuật
toán

Thông thường trong các ứng dụng thực tế, thời gian chính xác mà thuật
toán đòi hỏi để thực hiện nó ít được quan tâm hơn so với việc xác định
mức độ tăng lên của thời gian thực hiện thuật toán khi kích thước của dữ
liệu đầu vào tăng lên. Chẳng hạn, một thuật toán đang được xem xét nào
đó có thời gian tính trong trường hợp tồi nhất là
t(n) = 60n
2
+ 6n + 6 với đầu vào kích thước n.
Bảng 1.1
n t(n) = 60n
2
+ 6n + 6 60n
2
10 6066 6000
100 600606 600000
1000 60006006 60000000
10000 6000060006 6000000000
Trên bảng 1.1, khi n càng lớn thì ta có thể xấp xỉ t(n) với số hạng 60n
2
.
Trong trường hợp này t(n) có tốc độ tăng giống như 60n
2
.
Nếu t(n) được tính bằng giây, thì t(n) = n
2
+ 0, 1n + 0, 1 sẽ cho ta thời
gian đo bằng phút của thuật toán. Như vậy khi mô tả tốc độ tăng thời
gian tính của thuật toán với kích thước đầu vào tăng, ta chỉ quan tâm đến
số hạng trội (60n
2

), có thể bỏ qua các hằng số. Với giả thiết như vậy, thời
gian tính t(n) tăng giống như n
2
khi n tăng. Ta sẽ nói t(n) có bậc là n
2
và viết t(n) = θ(n
2
).
Tư tưởng ở đây là thay thế biểu thức t(n) = n
2
+0, 1n+0, 1 bởi biểu thức
đơn giản hơn n
2
có cùng tốc độ tăng với t(n).
Định nghĩa 1.1.5. Giả sử f và g là các hàm số đối số nguyên dương. Khi
đó
• f(n) có bậc không quá g(n), nếu tồn tại hằng số dương C
1
và N
1
∈ Z

+
sao cho f(n) ≤ C
1
.g(n) với ∀n ≥ N
1
. Kí hiệu f(n)=O(g(n)).
• f(n) có bậc ít nhất là g(n), nếu tồn tại hằng số dương C
2

và N
2
∈ Z

+
sao cho f(n) ≥ C
2
.g(n), với ∀n ≥ N
2
. Kí hiệu f(n) = Ω(g(n)).
10
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
• f(n) có bậc là g(n), nếu f(n) = O(g(n)) và f(n) = Ω(g(n)). Kí hiệu
f(n) = θ(g(n)).
Định nghĩa 1.1.6. Thời gian tính của thuật toán.
• Nếu thuật toán đòi hỏi thời gian tính tốt nhất là t(n) với đầu vào kích
thước n và t(n) = O(g(n)) thì thời gian tính tốt nhất của thuật toán có
bậc không quá g(n) hay thời gian tính tốt nhất của thuật toán là O(g(n)).
• Nếu thuật toán đòi hỏi thời gian tính tồi nhất là t(n) với đầu vào kích
thước n và t(n) = O(g(n)) thì thời gian tính tồi nhất của thuật toán có
bậc không quá g(n) hay thời gian tính tồi nhất của thuật toán là O(g(n)).
• Nếu thuật toán đòi hỏi thời gian tính trung bình là t(n) với kích thước
đầu vào là n và t(n) = O(g(n)) thì thời gian tính trung bình của thuật
toán có bậc không quá g(n) hay thời gian tính trung bình của thuật toán
là O(g(n)).
Trong định nghĩa trên nếu thay O bởi Ω và không quá bởi ít nhất, ta có
bậc ít nhất của thời gian tính tốt nhất, tồi nhất và trung bình của thuật
toán. Nếu thời gian tính tốt nhất của thuật toán vừa là O(g(n)) vừa là
Ω(g(n)) thì thời gian tính tốt nhất của thuật toán là θ(g(n)). Tương tự
như vậy, ta định nghĩa thời gian tính tồi nhất và trung bình của thuật

toán là θ(g(n)).
Ví dụ 1.1.7. Xác định vị trí của phần tử x trong dãy số a
1
, a
2
, , a
n
hoặc
xác định x không có mặt trong dãy số đó.
Phân tích
Nếu x trùng với số đầu tiên trong dãy thì thuật toán thực hiện 1 lần lặp.
Nếu x ở vị trí thứ i trong dãy thì thuật toán phải thực hiện i lần lặp.
Nếu x không có mặt trong dãy thì thuật toán phải thực hiện n lần lặp.
Thuật toán tựa Pascal:
Input: dãy a gồm n số a
1
, a
2
, , a
n
và phần tử x.
Output: vị trí của x trong dãy hoặc 0 nếu không tìm thấy.
Function linear_seach(a, n, x) : Integer;
Var i: byte;
Begin
ok := F lase;
For i:=1 to n do
If a
i
= x then

Begin
11
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
ok := T rue; break;
end;
If i ≤ n then linear_seach := i else linear_seach := 0;
end;
Độ phức tạp của thuật toán: Thời gian tính của thuật toán có thể
đánh giá bởi số lần thực hiện câu lệnh trong vòng For
Nếu a
1
= x thì câu lệnh trong thân vòng lặp For thực hiện một lần. Do
đó thời gian tính tốt nhất của thuật toán là θ(1).
Nếu x không có mặt trong dãy đã cho, thì câu lệnh trong thân vòng lặp
For thực hiện n lần. Do đó thời gian tính tồi nhất của thuật toán là θ(n).
Thời gian tính trung bình của thuật toán. Nếu x tìm thấy ở vị trí thứ i
của dãy (x = a
i
) thì câu lệnh For phải thực hiện i lần (i = 1, 2, 3, , n),
còn nếu x không có mặt trong dãy đã cho thì câu lệnh For phải thực hiện
n lần. Từ đó suy ra số lần trung bình phải thực hiện câu lệnh lặp For là:
[(1 + 2 + + n) + n]
n + 1

n
2
+ n
n + 1
= n
Vậy thời gian trung bình của thuật toán là O(n).

Mặt khác, do
[(1 + 2 + + n) + n]
n + 1

n
2
4
+ n
n + 1

n
2
4
+
n
4
n + 1
=
n
4
nên thời gian trung bình của thuật toán là Ω(n). Vì vậy, thời gian tính
trung bình của thuật toán là θ(n).
Từ đó, thuật toán tìm kiếm tuyến tính có độ phức tạp là θ(n).
Nhận xét 1.1.8. Phân tích độ phức tạp tính toán của một thuật toán là
một vấn đề phức tạp, nó đòi hỏi tư duy sáng tạo và có phương pháp với
cách tiếp cận riêng. Mặt khác trong rất nhiều trường hợp, ta không thể
thu được những đánh giá đẹp như ví dụ trên.
12
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
Bảng 1.2 tên gọi một số dạng đánh giá thông dụng.

Dạng đánh giá Tên gọi
θ(1) Hằng số
θ(log
2
n) Logarithm
θ(n) Tuyến tính
θ(nlog
2
n) nlog
2
n
θ(n
2
) Bậc hai
θ(n
3
) Bậc ba
θ(n
m
) Đa thức
θ(m
n
), m ≥ 2 Hàm mũ
θ(n!) Giai thừa
Trong bảng 1.2 các đánh giá được sắp xếp theo thứ tự tăng dần của tốc
độ tăng (ngoại trừ trường hợp θ(n
m
)).
Bảng 1.3 Đánh giá thời gian của thuật toán.
Đánh giá T/gian tính nếu n=

2 8 32 64
1 0,001 0,001 0,001 0,001
log
2
n 1 3 5 6
n 2 8 32 64
nlog
2
n 2 24 160 384
n
2
4 64 1,02 giây 4,09 giây
n
3
8 512 32,7 giây 4,36 phút
2
n
4 256 49,71 ngày 5, 85.10
8
năm
n! 2 40,3 giây 8, 34.10
2
3 năm 4, 02.10
7
8 năm
Trong bảng 1.3, cho ta thấy thời gian tính tăng như thế nào với các đánh
giá khác nhau, với đơn vị thời gian 0,001 giây (những số có đơn vị kèm
theo là những số gần đúng).
1.2 Tối ưu tổ hợp
1.2.1 Bài toán tối ưu tổ hợp

Định nghĩa 1.2.1. Bài toán tối ưu hóa tổ hợp được xác định bởi một tập
hữu hạn S và một ánh xạ f : S → R. Vấn đề đặt ra là xác định s

∈ S sao
cho:
f(s

) = min
s∈S
{f(s)}
13
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
Bài toán tìm phần tử cực đại có thể chuyển về bài toán tìm phần tử cực
tiểu vì:
max
s∈S
{f(s

)} = −min
s∈S
{−f(s)}
Hàm f(s) là hàm mục tiêu của bài toán, mỗi phần tử s ∈ S đươc gọi là
một phương án. Còn tập S gọi là tập các phương án của bài toán. Thông
thường tập S được mô tả như là tập các cấu hình tổ hợp được thỏa mãn
một số tính chất nào đó.
Phương án s

∈ S đem lại giá trị nhỏ nhất cho hàm mục tiêu được gọi là
phương án tối ưu, khi đó giá trị f


= f(s

) được gọi là giá trị tối ưu của
bài toán.
Sau đây ta xét một số bài toán tối ưu hóa tổ hợp truyền thống. Các bài
toán này một mặt giữ vai trò là những mô hình toán học có nhiều ứng dụng
trong thực tế, mặt khác chúng giữ vai trò quan trọng trong việc nghiên
cứu và phát triển lí thuyết tối ưu hóa tổ hợp.
1.2.2 Một số bài toán cụ thể
Bài toán 1.2.2. Bài toán người du lịch. Một người du lịch muốn đi
tham quan n thành phố T
1
, T
2
, , T
n
. Xuất phát từ một thành phố nào đó
người du lịch muốn đi qua tất cả các thành phố còn lại, mỗi thành phố
qua đúng một lần, rồi quay trở lại thành phố xuất phát. Biết c
ij
là chi phí
từ thành phố T
i
đến thành phố T
j
(i,j=1,2, ,n), hãy tìm hành trình (một
cách đi thỏa mãn điều kiện đặt ra) với tổng chi phí là nhỏ nhất.
Phân tích độ phức tạp của bài toán.
Ý tưởng giải bài toán: Giả sử mọi thành phố đều có đường nối, mỗi cách
đi là sự đánh số các thành phố T

1
, T
2
, , T
n
. Rõ ràng ta có thể thiết lập
tương ứng 1 −1 giữa các hành trình
T
π(1)
→ T
π(2)
→ → T
π(n)
→ T
π(1)
,
kí hiệu Π tập tất cả các hoán vị π = (π(1), π(2), , π(n)) của n số tự
nhiên 1, 2, , n. Khi đó bài toán có thể phát biểu dưới dạng bài toán tối
ưu tổ hợp sau.
min{f(π) : π ∈ Π}.
Phương pháp giải đơn giản nhất là xét tất cả các cách đi để tìm chu trình
bé nhất, tức là phải duyệt n! phép toán thì suy ra hành trình tối ưu.
Vậy đây là bài toán tối ưu tổ hợp có độ phức tạp cỡ n!
14
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
Bài toán 1.2.3. Bài toán cái túi. Một nhà thám hiểm cần đem theo
một cái túi có trọng lượng không quá b. Có n đồ vật có thể đem theo. Đồ
vật thứ j có trọng lượng a
j
và giá trị sử dụng c

j
với (j = 1, 2, , n). Hỏi
nhà thám hiểm cần đem theo các đồ vật nào để cho tổng giá trị sử dụng
của các đồ vật đem theo là lớn nhất?
Phân tích độ phức tạp của bài toán.
Ý tưởng giải bài toán: Gán một đồ vật j giá trị x
j
= 1 nếu được chọn,
x
j
= 0 nếu không được chọn. Do đó bài toán có thể phát biểu dưới dạng
bài toán tối ưu tổ hợp. Tìm dãy nhị phân (x
1
, x
2
, , x
n
) với x
j
∈ {0, 1}
sao cho:

x
j
.a
j
 b,


x

j
.c
j
đạt giá trị cực đại.
Cách giải bài toán là duyệt tất cả dãy nhị phân có độ dài n tương đương
với bài toán tìm số tập con của X có n phần tử. Số các phép toán cần thực
hiện là 2
n
.
Đây là bài toán tối ưu tổ hợp có độ phức tạp của tính toán là 2
n
.
Bài toán 1.2.4. Nhân hai ma trận.
Cho hai ma trận A, B vuông cấp n. Tính tích A.B
Phân tích độ phức tạp của bài toán.
Ý tưởng giải bài toán: - Gọi ma trận vuông C là ma trận tích của hai ma
trận vuông A, B cùng cấp.
- Mỗi phần tử của C được tính theo công thức: C
i,j
=

A
i,k
∗ B
k,j
với
k = 1, , n.
Thuật toán tựa pascal.
(* Tính ma trận tích *)
For i:= 1 to n do

For j:= 1 to n do
Begin
C[i, j] := 0;
for k:=1 to n do C[i, j] =C[i, j] + A[i, k] ∗ B[k, j];
End;
Ta thấy rằng thuật toán thực hiện chức năng chính của việc nhân ma trận
chính là ba vòng lặp For với các biến chỉ số i, j, k và việc thay đổi thứ tự
15
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
của ba vòng lặp này không ảnh hưởng gì tới kết quả.
Vậy độ phức tạp của thuật toán là n
3
.
1.2.3 Bài toán lớp P và lớp NP
Định nghĩa 1.2.5. Một bài toán được gọi là thuộc "lớp P" nếu tồn tại
một thuật toán đa thức để giải nó. Bài toán thuộc lớp P là bài toán "dễ".
Ví dụ 1.2.6. Bài toán 1.2.4 là bài toán thuộc lớp P vì độ phức tạp của
thuật toán để giải nó là O(n
3
) (tức là thuật toán đa thức).
Theo định nghĩa 1.2.5 ta đưa ra một ví dụ về bài toán "không dễ".
Định nghĩa 1.2.7. Một bài toán "nhận biết" là bài toán mà các kết
quả chỉ có thể lập một trong hai giá trị tại đúng hoặc sai.
Ví dụ 1.2.8. Bài toán về sự phân bố phù hợp.
Cho tập X = {x
1
, x
2
, , x
n

}; các biến Booles và một biểu thức Boole
đối với các số hạng của các biến này: E = C
1
∧ C
2
∧ ∧ C
n
trong đó
C
i
(i = 1, n) là một biểu thức: C
i
= u
j1
∧ u
j2
∧ ∧ u
jk(i)
với mỗi u
jq

một trong các biến của X. Bài toán đặt ra là tìm xem có một phân bố các
biến x
k
(k = 1, 2, , n) bằng 0 hay 1 sao cho E = 1.
Bài giải: Ta biết: 1 ∧ 1 = 1 và 1 ∧ 0 = 0 ∧ 1 = 0 ∧ 0 = 0; 1 = 0.
1 ∨0 = 0 ∨ 1 = 1 ∨ 1 = 1 và 0 ∨0 = 0; 1 = 0.
Như vậy đối với E = (x
1
∨ x

2
∨ x
3
)∧(x
1
∨ x
2
)∧(x
3
) . Câu trả lời là đúng
với x
1
= 0 hay 1, x
2
= 1, x
3
= 1.
Trong khi đó đối với E = (x
1
∨ x
2
∨ x
3
) ∧ (x
1
∧ x
2
) ∧ (x
3
) ∧ (x

2
∨ x
3
) .
Câu trả lời là sai với x
1
= 0 hay 1, x
2
= 1, x
3
= 1.
Nghiệm của bài toán nhận biết chỉ là đúng hoặc sai và không đòi hỏi gì
hơn. Điều này phân biệt một cách cơ bản của bài toán nhận biết với các
bài toán tồn tại cũng như với các bài toán về sự phân bố phù hợp.
Định nghĩa 1.2.9. Cho bài toán tối ưu tổ hợp min
s∈S
{f(s)} (tương ứng với
max
s∈S
{f(s)}) và một số a. Định nghĩa "bài toán nhận biết liên hợp" là bài
toán: Liệu có tồn tại s ∈ S sao cho f(s)  a (tương ứng f(s)  a).
Ví dụ 1.2.10. Cho một tập gồm n thành phố, các khoảng cách giữa các
thành phố và một số a. Bài toán với nội dung là xác định xem có tồn tại
một vòng đi với giá nhỏ hơn hoặc bằng a là bài toán liên hợp của bài toán
người du lịch 1.2.2.
16
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
Định lý 1.2.11. Nếu bài toán nhận biết liên hợp của bài toán tối ưu tổ
hợp đã cho là "khó" thì bài toán tối ưu hóa tổ hợp cũng là "khó".
Ký hiệu NP đặc trưng cho lớp các bài toán mà ta nghiên cứu bây giờ

trở nên như là "lường gạt". Vấn đề là nó không phải thuộc các bài toán
"không phải là đa thức" như người ta tưởng tượng.
Giả sử rằng ta biết câu trả lời của một bài toán nhận biết là đúng. Nếu ta
có thể chia sẻ sự tin chắc của ta cho một người "siêu quan sát" bằng thời
gian đa thức thì bài toán thuộc lớp NP , ngay cả khi ta không biết tìm
bằng thời gian đa thức một nghiệm s mà đối với nó câu trả lời là đúng.
Người ta chỉ đòi hỏi rằng nếu nghiệm s được đề xuất có thể thử lại được
bằng thời gian đa thức rằng câu trả lời tương ứng là đúng.
Nguyên tắc của người siêu quan sát cho ta một cách tiếp cận suy diễn của
lớp NP .
Định nghĩa 1.2.12. Một bài toán thuộc lớp NP nếu nó có thể giải được
bằng thời gian đa thức bởi một thuật toán không tiền định.
Nhận xét 1.2.13. Một bài toán nhận biết mà nó có thể giải được bằng
thuật toán đa thức thuộc về lớp NP và kéo theo là P ⊂ NP .
Vậy bài toán người du lịch, bài toán cái túi, , là những bài toán thuộc
lớp NP vì đối với chúng ta không biết thuật toán đa thức để giải nó. Mặt
khác ta chưa thể chứng minh được rằng P = NP , vì nếu biết rõ P = NP
thì có thể nói lớp NP chứa các bài toán khó hơn các bài toán lớp P.
Ký hiệu NP dẫn đến vấn đề là những bài toán của lớp này là những bài
toán có thể giải được nhờ một máy Turing bởi thuật toán không tiền định
có thời gian đa thức. Những thuật toán không tiền định là một kiến thức
siêu tưởng, chúng khác các thuật toán tiền định ở chỗ chúng không thể
đưa lên máy tính điện tử.
Kết luận chương 1.
Chương này trình bày khái niệm thuật toán, độ phức tạp của thuật toán
và một số bài toán bài toán tối ưu tổ hợp thực tế, từ đó nêu khái quát về
các bài toán lớp P và lớp NP .
17
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
Chương 2

Một số bài toán tối ưu tổ hợp trên
đồ thị
Đồ thị và mạng là mô hình khái quát của nhiều hệ thống thực tế như mô
hình tinh thể, cấu trúc phân tử, mạng điện, bản đồ giao thông, mạng máy
tính, Bên cạnh các bài toán tối ưu hóa tổ hợp cơ sở đã nêu thì trình
bày ứng dụng cụ thể về lớp bài toán tối ưu tổ hợp trên đồ thị là nhiệm vụ
của luận văn. Chương này trình bày một số khái niệm cơ bản và một số
thuật toán trên đồ thị.
2.1 Một số khái niệm
2.1.1 Đồ thị vô hướng
Định nghĩa 2.1.1. Đồ thị vô hướng G = (V, E) bao gồm V là tập các
đỉnh, và E là 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.
Định nghĩa 2.1.2. Hai đỉnh u và v của đồ thị vô hướng G được gọi là kề
nhau nếu (u, v) là cạnh của đồ thị G. Nếu e = (u, v) là cạnh của đồ thị ta
nói cạnh này là liên thuộc với hai đỉnh u và v, hoặc cũng nói là nối đỉnh u
và đỉnh v, đồng thời các đỉnh u và v sẽ được gọi là các đỉnh đầu của cạnh
(u, v).
Để có thể biết có bao nhiêu cạnh liên thuộc với một đỉnh, ta đưa vào định
nghĩa.
Định nghĩa 2.1.3. Ta gọi bậc của đỉnh v trên đồ thị vô hướng là số cạnh
liên thuộc với nó và sẽ ký hiệu là deg(v).
18
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
Đỉnh bậc 0 gọi là đỉnh cô lập. Đỉnh bậc 1 được gọi là đỉnh treo. Bậc của
đỉnh có tính chất sau.
Định lý 2.1.4. Giả sử G = (V, E) là đồ thị vô hướng với m cạnh. Khi đó
tổng bậc của tất cả các đỉnh bằng hai lần số cung.

v∈V

deg(v) = 2m.
Chứng minh. Mỗi cạnh e = (u, v) được tính một lần trong deg(u) và
một lần trong deg(v). Từ đó suy ra tổng tất cả các bậc của các đỉnh bằng
hai lần số cạnh.
Ví dụ 2.1.5. Đồ thị có n+1 đỉnh thì và mỗi đỉnh có bậc là 6 thì có bao
nhiêu cạnh?
Bài giải: Ta có 2m = 6(n + 1) => m = 3n + 3. Vậy số cạnh của đồ thị
là 3n+3 cạnh.
Hệ quả 2.1.6. Trên đồ thị vô hướng, số đỉnh bậc lẻ (nghĩa là có bậc là số
lẻ) là một số chẵn.
Chứng minh. Gọi O và U là tập các đỉnh bậc lẻ và tập các đỉnh bậc chẵn
của đồ thị. Ta có:
2m =

v∈V
deg(v) =

v∈O
deg(v) +

v∈U
deg(v).
Do deg(v) là chẵn với v ∈ U nên tổng thứ hai trong vế phải ở trên là số
chẵn. Từ đó suy ra tổng thứ nhất (chính là tổng bậc của các đỉnh lẻ) cũng
phải là số chẵn, do tất cả các số hạng của nó là số lẻ, nên tổng này phải
gồm một số chẵn các số hạng. Vậy số các đỉnh bậc lẻ là số chẵn.
2.1.2 Đồ thị có hướng
Định nghĩa 2.1.7. Đồ thị có hướng G = (V, E) bao gồm V là tập các
đỉnh, và E là tập các cặp có thứ tự gồm hai phần tử khác nhau của V gọi
là các cung.

Định nghĩa 2.1.8. Nếu e = (u, v) là cung của đồ thị có hướng G thì ta
nói đỉnh v là kề của u, và nói cung (u, v) nối đỉnh u với đỉnh v hoặc cũng
nói cung này là đi ra khỏi đỉnh u và vào đỉnh v. Đỉnh u (v) sẽ được gọi là
đỉnh đầu (cuối) của cung (u, v).
19
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
Định nghĩa 2.1.9. Ta gọi bán bậc ra (bán bậc vào) của đỉnh v trên đồ
thị có hướng là số cung của đồ thị đi ra khỏi nó (đi vào nó) và ký hiệu là
deg
+
(v) (deg

(v)).
Định lý 2.1.10. Giả sử G = (V, E) là đồ thị có hướng. Khi đó

v∈V
deg
+
(v) =

v∈V
deg

(v) = |E|.
Rất nhiều tính chất của đồ thị có hướng không phụ thuộc vào hướng trên
các cung của nó. Vì vậy, trong nhiều trường hợp sẽ thuận tiện hơn nếu ta
bỏ qua hướng trên các cung của đồ thị. Đồ thị vô hướng thu được bằng
cách bỏ qua hướng trên các cung được gọi là đồ thị vô hướng tương ứng
với đồ thị có hướng đã cho.
2.1.3 Đường đi, chu trình. Đồ thị liên thông

Định nghĩa 2.1.11. Đườ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, E) là dãy
x
0
, x
1
, , x
n−1
, x
n
,
trong đó u = x
0
, v = x
n
, (x
i
, x
i+1
) ∈ E, i = 0, 1, 2, , n −1.
Đường đi nói trên còn có thể biểu diễn dưới dạng dãy các cạnh:
(x
0
, x
1
), (x
1
, x
2
), , (x

n−1
, x
n
).
Đỉnh u gọi là đỉnh đầu, còn đỉnh v gọi là đỉnh cuối của đường đi. Đường
đi có đỉnh đầu trùng với đỉnh cuối (tức là u = v) được gọi là chu trình.
Đường đi hay chu trình được gọi là đơn nếu như không có cạnh nào bị
lặp lại.
Ví dụ 2.1.12. Xét đồ thị vô hướng cho trong hình 2.1.
Ta có: a, d, c, f, e là đường đi đơn độ dài 4. Còn d, e, c, a không là đường
đi, do (c, e) không phải là cạnh của đồ thị. Dãy b, c, f, e, b là chu trình
độ dài 4. Đường đi a, b, e, d, a, b có độ dài là 5 không phải là đường đi
đơn, do cạnh (a, b) có mặt trong nó hai lần.
Khái niệm đường đi và chu trình trên đồ thị có hướng được định nghĩa
hoàn toàn tương tự như trong trường hợp đồ thị vô hướng, chỉ khác là ta
có chú ý đến hướng trên các cung.
20
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
Hình 2.1: Đường đi trên đồ thị.
Định nghĩa 2.1.13. Đường đi độ dài n từ đỉnh u đến đỉnh v, trong
đó n là số nguyên dương, trên đồ thị có hướng G = (V, A) là dãy
x
0
, x
1
, , x
n−1
, x
n
,

với u = x
0
, v = x
n
, (x
i
, x
i+1
) ∈ A, i = 0, 1, 2, , n −1.
Đường đi nói trên còn có thể biểu diễn dưới dạng dãy các cung:
(x
0
, x
1
), (x
1
, x
2
), , (x
n−1
, x
n
).
Đỉnh u gọi là đỉnh đầu, còn đỉnh v gọi là đỉnh cuối của đường đi. Đường
đi có đỉnh đầu trùng với đỉnh cuối (tức là u = v) được gọi là chu trình.
Đường đi hay chu trình được gọi là đơn nếu như không có cạnh nào bị
lặp lại.
Ví dụ 2.1.14. Trên đồ thị có hướng cho trong hình 2.1 ta có a, d, c, f, e
là đường đi đơn độ dài 4. Còn d, e, c, a không là đường đi, do (c, e) không
phải là cạnh của đồ thị. Dãy b, c, f, e, b là chu trình độ dài 4. Đường đi a,

b, e, d, a, b có độ dài là 5 không phải là đường đi đơn, do cạnh (a, b) có
mặt trong nó hai lần.
Nếu sử dụng đồ thị để biểu diễn mạng máy tính (trong đó các đỉnh của đồ
thị tương ứng với các máy tính, còn các cạnh tương ứng với các kênh nối)
câu hỏi đặt ra là hai máy tính bất kì có thể trao đổi thông tin với nhau
hoặc trực tiếp qua kênh nối chúng hoặc thông qua một vài máy tính trong
mạng trung gian không? Câu hỏi đó được phát biểu trong ngôn ngữ đồ thị
như sau: Tồn tại hay không đường đi giữa mọi cặp đỉnh của đồ thị? Để
trả lời câu hỏi đó ta xét định nghĩa.
Định nghĩa 2.1.15. Đồ thị vô hướng G = (V, E) đượ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ó.
21
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
Hai máy tính bất kì trong mạng có thể trao đổi thông tin được với nhau
khi và chỉ khi đồ thị tương ứng với mạng này là đồ thị liên thông.
Định nghĩa 2.1.16. Đồ thị có hướng G = (V, E) được gọi là liên thông
mạnh nếu luôn tìm được đường đi giữa hai đỉnh bất kỳ của nó.
Định nghĩa 2.1.17. Đồ thị có hướng G = (V, E) được gọi là liên thông
yếu nếu đồ thị vô hướng tương ứng với nó là vô hướng liên thông.
2.2 Thuật toán tìm kiếm trên đồ thị
Sử dụng đồ thị coi như là một mô hình, ta cần kiểm tra các đỉnh: có thể
thực hiện việc kiểm tra này như một cuộc "dạo chơi" dọc theo các cạnh
(cung) mà theo đó ta đến thăm các đỉnh của đồ thị.
Định nghĩa 2.2.1. Một thủ tục cho phép chọn từ các đỉnh đã viếng thăm
một đỉnh tiếp theo trong cuộc dạo chơi là việc tìm kiếm trên đồ thị.
Đây chính là sự xác định một thứ tự trong việc kiểm tra các đỉnh. Cụ thể
hơn sự tìm kiếm đó như sau:
* Đánh số các đỉnh đã viếng thăm, ta nói số của một đỉnh biểu thị giờ
viếng thăm;
* Chọn một cạnh (cung) để đạt được đỉnh mới từ những đỉnh đã viếng

thăm. Nói cách khác là tại mỗi giờ, các đỉnh đã viếng thăm tạo lên một đồ
thị liên thông.
Ta xét hai phương pháp tìm kiếm trên đồ thị: Tìm kiếm theo chiều
sâu và Tìm kiếm theo chiều rộng.
Hai phương pháp này cho phép viếng thăm tất cả các đỉnh là tiếp theo
của một đỉnh xuất phát cố định ở trước đó mà ta gọi là gốc của tìm kiếm.
Để đơn giản, giả sử rằng đồ thị đã cất bỏ hướng và quan tâm đến các giờ
viếng thăm các đỉnh hơn là danh sách các cạnh đã qua trong cuộc dạo chơi
này. Việc chuyển kết quả từ đồ thị vô hướng sang đồ thị có hướng được
thực hiện không khó khăn.
2.2.1 Thuật toán tìm kiếm theo chiều sâu trên đồ thị
Ý tưởng chính của thuật toán:
Ta sẽ bắt đầu tìm kiếm từ một đỉnh v
0
nào đó của đồ thị. Sau đó chọn
u là một đỉnh tuỳ ý kề với v
0
và lặp lại quá trình đối với u. Ở bước tổng
22
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
quát, giả sử ta đang xét đỉnh v, chúng ta sẽ có hai khả năng sẽ xảy ra:
Nếu như trong số các đỉnh kề với v tìm được đỉnh w là chưa được xét thì
ta sẽ xét đỉnh này (nó sẽ trở thành đã xét) và bắt đầu từ nó ta sẽ tiếp
tục quá trình tìm kiếm. Ngược lại, nếu như không còn đỉnh nào kề với v
là chưa xét thì ta sẽ nói rằng đỉnh này là đã duyệt xong và quay trở lại
tiếp tục tìm kiếm từ đỉnh mà trước đó ta đến được đỉnh v (nếu v = v
0
,
thì kết thúc tìm kiếm). Do đó, tìm kiếm theo chiều sâu bắt đầu từ đỉnh v
được thực hiện trên cơ sở tìm kiếm theo chiều sâu từ tất cả các đỉnh chưa

xét kề với v.
Như vậy, trong quá trình thăm đỉnh bằng thuật toán tìm kiếm theo chiều
sâu, đỉnh được thăm càng muộn càng sớm được duyệt xong (Last In First
Out_Vào sau ra trước). Mô tả quá trình này bằng một thủ tục đệ quy
DFS (Depth first search) như sau:
Procedure DFS(v);
(*Tìm kiếm theo chiều sâu bắt đầu từ đỉnh v;
Các biến Chuaxet, Ke, là toàn cục*)
Begin
Tham_dinh(v);
Chuaxet[v] := false;
for u ∈ Ke(v) do
if Chuaxet[u] then DFS(u);
end; (*đỉnh v là đã duyệt xong*)
Khi đó, tìm kiếm theo chiều sâu trên đồ thị được thực hiện bằng:
Thuật toán mô tả tựa pascal.
Input: Đồ thị G = (V, E); đỉnh xuất phát S;
Output: Danh sách các đỉnh sau khi duyệt.
Begin
(*Khởi tạo*)
for v ∈ V do Chuaxet[u]:= true;
for v ∈ V do
if Chuaxet[v] then DFS(v);
end.
Nhận xét: Rõ ràng lệnh gọi DF S(v) sẽ cho phép đến thăm tất cả các
đỉnh thuộc cùng thành phần liên thông với đỉnh v, bởi vì sau khi thăm
đỉnh là lệnh gọi đến thủ tục DFS đối với tất cả các đỉnh kề với nó. Mặt
khác, do mỗi khi thăm đỉnh v xong, biến Chuaxet[v] được đặt lại giá trị
23
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên

×