Tuy nhiên, do việc tính toán trên đồ thị thường là cầnkhối lượng tính toán cũng như không gian nhớ lớn, vì vậy gần đây cùngvới sự phát triển mạnh mẽ của kỹ thuật máy tính điện tử, các bà
Trang 1ĐẠI HỌC THÁI NGUYÊNTRƯỜNG ĐẠI HỌC KHOA HỌC
ĐOÀN NGỌC LÀNH
MỘT SỐ BÀI TOÁNTỐI ƯU TỔ HỢP TRÊN ĐỒ THỊ
LUẬN VĂN THẠC SĨ TOÁN HỌC
Thái Nguyên - 2012
Trang 2ĐẠI HỌC THÁI NGUYÊNTRƯỜNG ĐẠI HỌC KHOA HỌC
ĐOÀN NGỌC LÀNH
MỘT SỐ BÀI TOÁNTỐ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
Trang 3Mục lục
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 N P 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
Trang 42.4.2 Lát cắt Đường tăng luồng Định lí Ford - Fulkerson 432.4.3 Thuật toán tìm luồng cực đại trong mạng 462.4.4 Một số bài toán luồng tổng quát 542.4.5 Một số ứng dụng trong tổ hợp từ bài toán luồng 57
Trang 5Mở đầ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ầnkhối lượng tính toán cũng như không gian nhớ lớn, vì vậy gần đây cùngvớ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ạpthuật toán, m ột số bài toán tối ưu cụ thể trên đồ thị và trình bày thuậttoá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ậttoá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ậnvă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ìnhcủ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 đượcbà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ườngTHPT Xuân Vân, Tổ Toán trường THPT Xuân Vân đã giúp đỡ tạo điềukiện cho tôi hoàn thành khóa học này
Trang 6Em 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ô đã thamgia giảng dạy khóa cao học 2010 - 2012, lời cảm ơn sâu sắc nhất về cônglao 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
Trang 7Chươ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ậttoá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ênnhà 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éptính số học với các con số được viết trên hệ thập phân Sau đó, Algorismchuyể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áchhình thức chính xác thông qua máy Turing Tuy nhiên trong Luận văn nàykhá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ụcxác định, được chia ra thành các phép toán cơ bản, biến đổi một dãy cácdấ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ộttập hợp đã được chỉ rõ (tập đã xác định)
Trang 8• Đầ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ônggâ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ủathuậ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ạnbướ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ướcthự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ốngnhau cho trước làm input, thuật toán đơn định sẽ thi hành các mã lệnhgiố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ácnhau
• Tính tổng quát (Generality): Thuật toán có thể giải bất kỳ một bàitoá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ậndụng được thuật toán
• Tính hiệu quả (The effectiveness): Hiệu quả về thời gian: Thuậttoán phải được thực hiện trong thời gian cho phép, điều này khác vớilời giải toán (chỉ cần chứng minh là kết thúc sau hữu hạn bước) Tínhhiệ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ônngữ 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ônngữ 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ônngữ lập trình Pascal
Trang 9Ví 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ữuhạ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ạnnà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ơngiá 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 a1, a2, , an
Output: Max là số lớn nhất trong dãy
Procedure Max(a1, a2, , an : integer);
Thuật toán này trước hết gán số hạng đầu tiên a1 của dãy cho biến M ax.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ếumột số hạng lớn hơn giá trị hiện thời của M ax thì nó được gán làm giátrị mới của M ax
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ínhhiệ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ựchiện thuật toán Để đo tính hiệu quả của một thuật toán đã cho, ta thiếtlậ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:
Trang 101) 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àitoá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ộtkí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ậttoá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ượngthời gian và bộ nhớ cần thiết để thực hiện thuật toán (ta gọi là thời giantí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 xemxé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ờigian 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ầnthiế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ướcn
Để 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ẩnkhá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?
Trang 11Phân tích Số nguyên dương n là số nguyên tố khi và chỉ khi n > 1 và nchỉ có hai ước là 1 và chính nó hay n>1 và n không chia hết cho k với
If (n mod i =0) then ok:=False;
If ok then n_nguyên_tố else n_hợp_số;
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ìnhtrê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;
Trang 12Độ phức tạp của thuật toán khi đó cỡ√
n Ví dụ n=10000 thì chương trìnhtrê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ậttoán đòi hỏi để thực hiện nó ít được quan tâm hơn so với việc xác địnhmứ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) = 60n2 + 6n + 6 với đầu vào kích thước n
Nếu t(n) được tính bằng giây, thì t(n) = n2 + 0, 1n + 0, 1 sẽ cho ta thờigian đo bằng phút của thuật toán Như vậy khi mô tả tốc độ tăng thờigian 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 (60n2), có thể bỏ qua các hằng số Với giả thiết như vậy, thờigian tính t(n) tăng giống như n2 khi n tăng Ta sẽ nói t(n) có bậc là n2
Trang 13• 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íchthướ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íchthướ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ậttoá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ậttoá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ậttoán là θ(g(n))
Ví dụ 1.1.7 Xác định vị trí của phần tử x trong dãy số a1, a2, , an hoặcxá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ố a1, a2, , an 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;
Trang 14ok := 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 a1 = 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ặpFor 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ứ icủa dãy (x = ai) 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]
2 + n
n + 1 = nVậy thời gian trung bình của thuật toán là O(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ớicá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
Trang 15Bả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
θ(log2n) Logarithmθ(n) Tuyến tínhθ(nlog2n) nlog2nθ(n2) Bậc haiθ(n3) Bậc baθ(nm) Đa thứcθ(mn), m ≥ 2 Hàm mũθ(n!) Giai thừaTrong 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 θ(nm))
Bảng 1.3 Đánh giá thời gian của thuật toán
n! 2 40,3 giây 8, 34.1023 năm 4, 02.1078 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 đánhgiá khác nhau, với đơn vị thời gian 0,001 giây (những số có đơn vị kèmtheo 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ậphữu hạn S và một ánh xạ f :S →R Vấn đề đặt ra là xác định s∗ ∈ S saocho:
f (s∗) = min
s∈S {f (s)}
Trang 16Bà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ựctiểu vì:
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ủabà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àitoá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ụngtrong thực tế, mặt khác chúng giữ vai trò quan trọng trong việc nghiêncứ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 đitham quan n thành phố T1, T2, , Tn 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 cij là chi phí
từ thành phố Ti đến thành phố Tj (i,j=1,2, ,n), hãy tìm hành trình (mộtcá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ố T1, T2, , Tn Rõ ràng ta có thể thiết lậptương ứng 1 − 1 giữa các hành trình
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!
Trang 17Bài toán 1.2.3 Bài toán cái túi Một nhà thám hiểm cần đem theomộ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 aj và giá trị sử dụng cj với (j = 1, 2, , n) Hỏinhà thám hiểm cần đem theo các đồ vật nào để cho tổng giá trị sử dụngcủ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ị xj = 1 nếu được chọn,
xj = 0 nếu không được chọn Do đó bài toán có thể phát biểu dưới dạngbài toán tối ưu tổ hợp Tìm dãy nhị phân (x1, x2, , xn) với xj ∈ {0, 1}sao cho:
Đây là bài toán tối ưu tổ hợp có độ phức tạp của tính toán là 2n
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 matrậ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: Ci,j = P
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ậnchí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ự
Trang 18củ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à n3
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ếtquả 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 = {x1, x2, , xn}; 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 = C1 ∧ C2 ∧ ∧ Cn trong đó
Ci(i = 1, n) là một biểu thức: Ci = uj1 ∧ uj2 ∧ ∧ ujk(i) với mỗi ujq là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ácbiến xk(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
Đị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ớimax
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àitoán: Liệu có tồn tại s ∈ S sao cho f (s) 6 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ácthà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ạimộ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ánngười du lịch 1.2.2
Trang 19Đị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 N P đặ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ờigian đa thức thì bài toán thuộc lớp N P, ngay cả khi ta không biết tìmbằ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 đượcbằ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ủalớp N P
Định nghĩa 1.2.12 Một bài toán thuộc lớp N P nếu nó có thể giải đượcbằ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ằngthuật toán đa thức thuộc về lớp N P và kéo theo là P ⊂ N P
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ộclớp N P vì đối với chúng ta không biết thuật toán đa thức để giải nó Mặtkhác ta chưa thể chứng minh được rằng P 6= N P, vì nếu biết rõ P 6= N Pthì có thể nói lớp N P chứa các bài toán khó hơn các bài toán lớp P
Ký hiệu N P dẫn đến vấn đề là những bài toán của lớp này là những bàitoá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ứcsiê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 N P
Trang 20và đỉ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 địnhnghĩ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ạnhliên thuộc với nó và sẽ ký hiệu là deg(v)
Trang 21Đỉ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í dụ 2.1.5 Đồ thị có n+1 đỉnh thì và mỗi đỉnh có bậc là 6 thì có baonhiê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ẵncủa đồ thị Ta có:
Trang 22Đị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 đó
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
x0, x1, , xn−1, xn,trong đó u = x0, v = xn, (xi, xi+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:
(x0, x1), (x1, x2), , (xn−1, xn)
Đỉ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ĩahoà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
Trang 23Hì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
x0, x1, , xn−1, xn,với u = x0, v = xn, (xi, xi+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:
(x0, x1), (x1, x2), , (xn−1, xn)
Đỉ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ôngphả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 nhauhoặ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 trongmạ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ôngnếu luôn tìm được đường đi giữa hai đỉnh bất kỳ của nó
Trang 24Hai máy tính bất kì trong mạng có thể trao đổi thông tin được với nhaukhi 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ôngmạ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ôngyế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ămmộ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ếngthă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ềusâ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 theocủ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ơinày Việc chuyển kết quả từ đồ thị vô hướng sang đồ thị có hướng đượcthự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 v0 nào đó của đồ thị Sau đó chọn
u là một đỉnh tuỳ ý kề với v0 và lặp lại quá trình đối với u Ở bước tổng
Trang 25quá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ếptụ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ạitiếp tục tìm kiếm từ đỉnh mà trước đó ta đến được đỉnh v (nếu v = v0,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ưaxé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ềusâu, đỉnh được thăm càng muộn càng sớm được duyệt xong (Last In FirstOut_Vào sau ra trước) Mô tả quá trình này bằng một thủ tục đệ quyDFS (Depth first search) như sau:
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
Trang 26false nên mỗi đỉnh sẽ được thăm đúng một lần Thuật toán lần lượt sẽtiến hành tìm kiếm từ các đỉnh chưa được thăm, vì vậy DFS xét qua tất
cả các đỉnh của đồ thị (không nhất thiết phải là liên thông)
Độ phức tạp tính toán của thuật toán Số phép toán cần thực hiệntrong hai chu trình của thuật toán (hai vòng for của chương trình chính)
là cỡ |V| Thủ tục DFS phải thực hiện không quá |V| lần Tổng số phéptoán cần phải thực hiện trong các thủ tục này là O(|V| + |E|), do trongcác thủ tục này ta phải xét qua tất cả các cạnh và các đỉnh của đồ thị.Vậy độ phức tạp tính toán của thuật toán là O(|V| + |E|)
Ví dụ 2.2.2 Xét đồ thị cho trong hình 2.2 Các đỉnh của nó được đánh
số lại theo thứ tự chúng được thăm theo thủ tục tìm kiếm theo chiều sâu
mô tả ở trên Giả thiết rằng đỉnh xuất phát là đỉnhA(1) và các đỉnh trongdanh sách kề của đỉnh v(Ke(v)) được sắp xếp theo thứ tự tăng dần củachỉ số
Hình 2.2: Thuật toán DFS.
Các đỉnh của nó được đánh số lại theo thứ tự chúng được duyệt theo DFSlà: A → D → I → J → K → G → C → E → B → F → H Giả thiếtcác đỉnh trong danh sách kề của đỉnh v(ke(v)) được sắp xếp theo thứ tựtăng dần của chỉ số
Với cây thể hiện quá trình đệ quy DFS ở trên, ta thấy nếu dây chuyền đệquy là: DF S(S) → DF S(u1) → DF S(u2) → thì thủ tục DFS nàogọi cuối dây chuyền sẽ được thoát ra đầu tiên, thủ tục DF S(S) gọi đầudây chuyền sẽ được thoát cuối cùng, từ đây ta có ý tưởng mô phỏng dâychuyền đệ quy bằng một ngăn xếp (Stack)
Thuật toán tìm kiếm theo chiều sâu trên đồ thị vô hướng trình bày ở trên
Trang 27Hình 2.3: Thuật toán DF S mô phỏng bằng ngăn xếp (Stack).
dễ dàng có thể mô tả lại cho đồ thị có hướng Trong trường hợp đồ thị cóhướng, thủ tục DF S(v) sẽ cho phép thăm tất cả các đỉnh u nào mà từ v
có đường đi đến u Độ phức tạp tính toán là O(|V| + |E|)
2.2.2 Tìm kiếm theo chiều rộng trên đồ thị
Ý tưởng chính của thuật toán:
Để ý rằng trong thuật toán tìm kiếm theo chiều sâu đỉnh được thăm càngmuộn sẽ càng sớm trở thành đã duyệt xong Điều đó là hệ quả tất yếucủa việc các đỉnh được thăm sẽ được kết nạp vào trong ngăn xếp (Stack).Tìm kiếm theo chiều rộng trên đồ thị, được xây dựng dựa trên cơ sở thaythế ngăn xếp (Stack) bởi hàng đợi (Queue) Với sự cải biên như vậy, đỉnhđược thăm càng sớm sẽ trở thành đã duyệt xong (tức là càng sớm dời khỏihàng đợi) Một đỉnh trở thành đã duyệt xong ngay sau khi ta xét xong tất
cả các đỉnh kề (chưa được thăm) với nó
Giả sử ta có một danh sách chứa những đỉnh đang "chờ" thăm Tại mỗibước, ta thăm một đỉnh đầu danh sách và cho những đỉnh chưa "xếp hàng"
kề với nó xếp hàng thêm vào cuối danh sách Chính vì nguyên tắc đó nêndanh sách chứa những đỉnh đang chờ sẽ được tổ chức dưới dạng hàng đợi(Queue) Khi đó thuật toán được thực hiện theo các bước sau
Bước 1: Khởi tạo Các đỉnh đều ở trạng thái chưa đánh dấu, ngoại trừđỉnh xuất phát S là đã đánh dấu Một hàng đợi(Queue), ban đầu chỉ cómột phần tử là S Hàng đợi dùng để chứa các đỉnh sẽ được duyệt theo thứ
tự ưu tiên chiều rộng
Trang 28Bước 2: Lặp các bước sau đến khi hàng đợi rỗng Lấy u khỏi hàngđợi, thông báo thăm u (bắt đầu việc duyệt đỉnh u) Xét tất cả những đỉnh
v kề với u mà chưa được đánh dấu, với mỗi đỉnh v đó:
Đánh dấu v;
Ghi nhận vết đường đi từ u tới v(Có thể làm chung với việc đánh dấu);Đẩy v vào hàng đợi (v sẽ chờ được duyệt tại những bước sau);
Bước 3: Truy vết tìm đường đi
Thủ tục tìm kiếm theo chiều rộng xuất phát từ đỉnh v được biểu diễn bởihàm BF S(v) (viết tắt của cụm từ Breadth-First Search)
Procedure BF S(v);
(*Tìm kiếm theo chiều rộng bắt đầu từ đỉnh v;
Các biến Chuaxet, Ke là biến toàn cục*)
for u ∈ Ke(p) do
if Chuaxet[u] thenbegin
đã được thăm
Khi đó, tìm kiếm theo chiều rộng trên đồ thị được thực hiện nhờ thuậttoán sau
Trang 29Hình 2.4: Thuật toán BFS sử dụng hàng đợi QUEUE.
Thuật toán mô tả tựa pascal
Độ phức tạp của thuật toán BFS
Lập luận tương tự như trong thủ tục tìm kiếm theo chiều sâu, có thể chỉ
ra được rằng lệnh gọi BF S(v) sẽ cho phép đến thăm tất cả các đỉnh thuộccùng thành phần liên thông với đỉnh v, và mỗi đỉnh của đồ thị sẽ đượcthăm đúng một lần Độ phức tạp tính toán của thuật toán làO(|E| + |V|).Quá trình tìm kiếm trên đồ thị bắt đầu từ một đỉnh có thể thăm tất cảcác đỉnh còn lại, khi đó cách biểu diễn đồ thị có ảnh hưởng lớn tới chi phí
về thời gian thực hiện thuật toán
Trong trường hợp ta biểu diễn đồ thị bằng danh sách kề, cả hai thuật toánBFS và DFS đều có độ phức tạp tính toán là O(|V| + |E|) Đây là cáchcài đặt tốt nhất
Ví dụ 2.2.3 Xét đồ thị trong Hình 2.5 Thứ tự thăm đỉnh của đồ thị nàytheo thuật toán BFS được ghi trong ngoặc, đường đi là nét in đậm
Thứ tự các đỉnh được thăm theo BFS là A → B → C → D → E → F →
G → H → I → J → K
Trang 30Hình 2.5: Thuật toán BFS
Bài toán 2.2.4 Vận dụng thuật toán DFS và BFS Một nhóm gồm
n sinh viên đi thám hiểm, mỗi người được trang bị một máy liên lạc Mỗimáy có một mã số là một chuỗi sáu chữ số Máy A liên lạc trực tiếp vớimáy B nếu hai số cuối của máy A trùng với hai số đầu của máy B Máy Aliên lạc được với máy B nếu có dãy A = A1, , An = B sao cho Ai liênlạc trực tiếp với Ai+1 Hãy cho biết với hai bạn bất kì X, Y trong nhóm cóthể liên lạc được với nhau hay không?
Bài giải: Mỗi sinh viên được trang bị một máy liên lạc có một mã số cốđịnh là chuỗi sáu chữ số Khi đó, mỗi mã số liên lạc là một đỉnh của đồthị Máy A liên lạc trực tiếp với B thì có một cung đi từ A đến B Khi đótồn tại một đồ thị (G) gồm n đỉnh, có hướng biểu diễn sự liên lạc của cácđối tượng trong nhóm Cần xem máy X và máy Y trong nhóm có liên lạcđược với nhau hay không?
Để trả lời câu hỏi đó ta thực hiện thuật toán BFS trên đồ thị(G)có hướng,bắt đầu từ đỉnh X cho đến khi thấy được đỉnh Y thì kết luận hai bạn X
và Y có thể liên lạc được với nhau Ngược lại kết luận X và Y không liênlạc được với nhau
Ví dụ 2.2.5 Input: Nhóm gồm 9 sinh viên với 9 máy liên lạc được gắn
mã số là mã số của 9 đỉnh đồ thị như sau
A: 12 87 56 B: 56 43 23 C: 23 48 43
S: 56 21 23 D: 23 45 12 E: 43 16 12
H: 78 61 43 T: 43 89 65 F: 65 71 23
Trang 31được minh họa bởi đồ thị hình 2.6.
Hình 2.6: Vận dụng thuật toán BFS.
Output: a) Máy A có liên lạc được với máy T không?
b) Máy A có liên lạc được với máy H không?
Bài giải: Vận dụng thuật toán duyệt đồ thị BFS với đồ thị có hướng trênhình 2.6 đỉnh xuất phát là A, thứ tự duyệt các đỉnh là:A, B, S, C, D, E, T, F.a) Có đường đi từ A đến T Máy A có liên lạc được với máy T
b) Không có đường đi từ A đến H Máy A không liên lạc được với máy H
2.3 Bài toán đường đi ngắn nhất
Trong phần này chúng ta chỉ xét đồ thị có hướng G = (V,E), |V| = n,
|E| = m với các cung được gán trọng số, nghĩa là, mỗi cung (u, v) ∈ Ecủa nó được đặt tương ứng với một số thực a(u, v) gọi là trọng số của nó.Chúng ta sẽ đặt a(u, v) = ∞, nếu (u, v) /∈ E.
Nếu dãy v0, v1, , vp là một đường đi trên G, thì độ dài của nó được địnhnghĩa là tổng sau
p
X
i=1
a(vi−1, vi),
tức là, độ dài của đường đi chính là tổng các trọng số trên các cung của
nó (Chú ý rằng nếu chúng ta gán trọng số cho tất cả các cung đều bằng 1,thì ta thu được định nghĩa độ dài của đường đi như là số cung của đường
đi trên đồ thị)
Trang 32Bài toán tìm đường đi ngắn nhất trên đồ thị dưới dạng tổng quát có thểphát biểu như sau: Tìm đường đi có độ dài nhỏ nhất từ một đỉnh xuấtphát s ∈ V đến đỉnh cuối (đích) t ∈ V Đường đi như vậy ta sẽ gọi làđường đi ngắn nhất từ s đến t còn độ dài của nó ta sẽ ký hiệu là d(s, t)
và còn gọi là khoảng cách từ s đến t (khoảng cách định nghĩa như vậy cóthể là số âm) Nếu như không tồn tại đường đi từ s đến t thì ta sẽ đặtd(s, t) = ∞ Rõ ràng, nếu như mỗi chu trình trên đồ thị đều có độ dàidương, thì trong đường đi ngắn nhất không có đỉnh nào bị lặp lại (đường
đi không có đỉnh lặp lại sẽ được gọi là đường đi cơ bản) Mặt khác, nếutrên đồ thị có chu trình với độ dài âm (chu trình như vậy gọi là chu trìnhâm) thì khoảng cách giữa một số cặp đỉnh nào đó của đồ thị có thể làkhông xác định, bởi vì bằng cách đi vòng theo chu trình này một số đủlớn lần, ta có thể chỉ ra đường đi giữa các đỉnh này có độ dài nhỏ hơn bất
cứ một số thực nào cho trước Trong những trường hợp như vậy, có thểđặt vấn đề tìm đường đi cơ bản ngắn nhất, tuy nhiên bài toán đặt ra sẽtrở nên phức tạp hơn rất nhiều Ta chú ý rằng nếu biết khoảng cách từ sđến t, thì đường đi ngắn nhất từ s đến t, trong trường hợp trọng số không
âm, có thể tìm được một cách dễ dàng Để tìm đường đi, chỉ cần để ý làđối với cặp đỉnh s, t ∈ V tuỳ ý (s 6= t) luôn tìm được đỉnh v sao cho,
số dễ dàng suy ra rằng dãy t, v, u, không chứa đỉnh lặp lại và kết thúc
ở đỉnh s Rõ ràng dãy t, v, u, được xác định (nếu lật ngược thứ tự cácđỉnh trong nó) ta có đường đi ngắn nhất từ s đến t Từ đó ta có thủ tụcsau đây để tìm đường đi ngắn nhất từ s đến t khi biết độ dài của nó.Thủ tục tìm đường đi ngắn nhất
Input: d[v] - khoảng cách từ đỉnh s đến tất cả các đỉnh còn lại v ∈ V;
t - đỉnh đích;
a[u, v], u, v ∈ V - ma trận trọng số trên các cung.
Output: STACK chứa dãy đỉnh xác định đường đi ngắn nhất từ s đến t.Procedure Find_Path;
Trang 33kỹ thuật ghi nhận đường đi như thuật toán tìm kiếm Dùng biến mảng
T ruoc[v], v ∈ V, để ghi nhớ đỉnh đi trước v trong đường đi tìm kiếm.Dưới đây ta sẽ xét một số thuật toán tìm đường đi ngắn nhất từ đỉnh Stới đỉnh F trên đơn đồ thị có hướng G = (V,E) có n đỉnh và m cung.Trong trường hợp đơn đồ thị vô hướng với trọng số không âm, bài toántìm đường đi ngắn nhất có thể dẫn về bài toán trên đồ thị có hướng bằngcách thay mỗi cạnh của nó bằng hai cung có hướng ngược chiều nhau vớicùng trọng số của cạnh tương ứng Lưu ý rằng các thuật toán dưới đây sẽluôn luôn tìm được đường đi ngắn nhất là đường đi cơ bản
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
Phần lớn các thuật toán tìm khoảng cách giữa hai đỉnh s và t được xâydựng nhờ đánh giá sau: Từ ma trận trọng số a[u, v], u, v ∈ V Tính cậntrên d[v] của khoảng cách từ s đến tất cả các đỉnh v ∈ V Mỗi khi pháthiện
d[u] + a[u, v] < d[v],thì cận trên d[v] sẽ được làm tốt lên: d[v] := d[u] + a[u, v] Quá trình đó
sẽ kết thúc khi nào chúng ta không làm tốt thêm bất cứ cận trên nào.Khi đó, rõ ràng giá trị của mỗi d[v] sẽ cho ta khoảng cách từ đỉnh s đếnđỉnh v Khi thể hiện kỹ thuật tính toán này trên máy tính, cận trên d[v]
sẽ được gọi là nhãn của đỉnh v, còn việc tính lại các cận trên này sẽ gọi
là phép gán nhãn cho đồ thị gọi là thủ tục gán nhãn Nhận thấy rằng đểtính khoảng cách từ s đến t, ta phải tính khoảng cách từ s đến tất cả các