1. Chu trình Hamilton
Định nghĩa: Giả sử G = <X, U> là đồ thị vô hướng. Chu trình Hamilton là chu trình đi qua tất cả các đỉnh của đồ thị, mỗi đỉnh đúng một lần.
Định lý 1: Nếu đơn đồ thị liên thông G = <X, U>, n đỉnh và n ³ 3 có bậc ở mỗi đỉnh không nhỏ hơn nửa số đỉnh của đồ thị, tức là mọi x ẻ X ta luôn có
m(x) ³ n/2 thì trong đồ thị có tồn tại chu trình Hamilton.
Chứng minh: Ta chứng minh định lý bằng phản chứng
Giả sử G = <X, U> có n đỉnh là đồ thị không có chu trình Hamilton. Ta thêm vào một số đỉnh mới và nối mỗi đỉnh mới này với mọi đỉnh của G, ta được đồ thị G'. Giả sử có số k > 0 là số tối thiểu các đỉnh cần thiết để G' chứa một chu trình Hamilton. Như vậy G' có n + k đỉnh.
a) b)
Hình 2.1
Gọi P là chu trình Hamilton ayb...a trong G', trong đó a và b là các đỉnh của G, còn y là một trong các đỉnh mới. Thế thì b không kề với a, vì nếu trái lại thì ta có thể bỏ đỉnh y và được chu trình ab...a, mâu thuẫn với giả thiết về tính chất tối thiểu của k.
Hơn nữa nếu a' là một đỉnh kề nào đó của a (khác với y) và b' là đỉnh nối tiếp ngay a' trong chu trình P (hình 2.1.b) thì b' không thể là đỉnh kề của b (nếu trái lại thì ta có thể thay P bởi chu trình aa'..bb'..a, trong đó không có y).
Như vậy, với mỗi đỉnh kề với a ta có một đỉnh không kề với b, tức là số đỉnh không kề với b không thể ít hơn số đỉnh kề với a (số đỉnh kề với a không nhỏ hơn n/2 + k). Mặt khác, theo giả thiết, số đỉnh kề với b cũng không nhỏ hơn n/2 + k. Vì không có đỉnh nào vừa kề với b lại vừa không kề với b, nên số đỉnh của G' không ít hơn 2.(n/2 + k) = n + 2k, mâu thuẫn với giả thiết là số đỉnh của G' bằng n + k, (k > 0). Định lý được chứng minh.
Ví dụ: Đồ thị trong hình 2.1.a có 8 đỉnh, đỉnh nào cũng có bậc 4. Vậy G có chu trình Hamilton. Có thể thấy một chu trình Hamilton a-g-c-k-d-h-b-e-a.
2. Đường Hamilton
Định nghĩa: Đường Hamilton trong đồ thị G = <X, U> là đường đi qua tất cả các đỉnh mỗi đỉnh đúng một lần.
Định lý 2: Giả sử G = <X, U> là đồ thị có hướng và đầy đủ khi đó trong đồ thị luôn tồn tại đường Hamilton.
a b c d k g e h a y b a' b'
Chứng minh: Giả sử w = xi1 xi2 ... xik xik+1 .. xim - 1 xim là một đường sơ cấp bất kỳ trong đồ thị. Để đơn giản, ta chỉ viết các đỉnh mà không có các cạnh xen kẽ như định nghĩa.
Nếu trong đường sơ cấp w mà tất cả các đỉnh trong X đều có mặt thì chính w là đường Hamilton. Còn nếu có những đỉnh trong X nhưng chưa có mặt trong w thì ta có thể bổ sung hết những đỉnh đó vào đường w sơ cấp để nó trở thành đường Hamilton theo nguyên tắc sau đây:
Giả sử x ẻ X mà x không nằm trên đường sơ cấp w. Các trường hợp sau đây xảy ra do tính đầy đủ của đồ thị G:
- Nếu x có cung tới xi1 thì bổ sung x vào đầu w và nó có dạng: x xi1 xi2 ... xik xik+1 .. xim - 1 xim
- Nếu từ xik có cung tới x và từ x có cung tới xik+1 thì ta bổ sung x vào giữa hai đỉnh xik và xik+1. Khi đó w có dạng:
xi1 xi2 ... xik x xik+1 .. xim - 1 xim
- Nếu từ xik và xik+1 có cung đi tới x và từ x lại cung đi tới xik+2 thì ta bổ sung x vào giữa hai đỉnh xik + 1 và xik+2 ta được w có dạng:
xi1 xi2 ... xik xik+1 x xik + 2 .. xim - 1 xim
- Nếu mọi k ẻ [1, m - 1] mà từ xik và xik+1 có cung sang x thì ta bổ sung x vào cuối, khi đó nó có dạng:
xi1 xi2 ... xik xik+1 x xik + 2 .. xim - 1 xim x
Bằng cách đó ta có thể bổ sung vào w các đỉnh trong đồ thị mà chưa có mặt trong w để nó trở thành đường Hamilton.
Định lý được chứng minh.
Hệ quả: Giả sử G = <X, U> là đồ thị đầy đủ có số đỉnh n ³ 3. Khi đó trong đồ thị luôn luôn tồn tại chu trình Hamilton.
a) b)
Hình 2.2
Ví dụ đồ thị trong hình 2.2.a có chu trình Hamilton nhưng nó không phải là đồ thị đầy đủ. Còn đồ thị hình 2.2.b không có đường Hamilton.
3. Thuật toán liệt kê tất cả các chu trình Hamilton
4 1 3 2 2 1 3 4 5 6
Thuật toán được xây dựng dựa trên cơ sở thuật toán quay lui cho phép liệt kê tất cả các chu trình Hamilton của đồ thị
Procedure Hamilton(k);
{Liệt kê các chu trình Hamilton thu được bằng việc phát triển dãy đỉnh x[1], ..., x[k-1] của đồ thị G = <X, U> cho bởi danh sách kề Ke(v), v ẻ X
} 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; BEGIN
For v ẻ X do ChuaXet[v] := True;
x[1] := v0; {v0 là một đỉnh nào đó của đồ thị} ChuaXet[v0] := False;
Hamilton(2); END.
Chương 4
ĐƯỜNG ĐI NGẮN NHẤT TRONG ĐỒ THỊ
Giới thiệu:
Trong các ứng dụng thực tế bài toán tìm đường đi ngắn nhất giữa hai đỉnh của một đồ thị liên thông có ý nghĩa rất lớn. Bài toán tìm đường đi ngắn nhất được ứng dụng trong thực tế như để chọn một hành trình tiết kiệm nhất (về thời gian hoặc chi phí) trên một mạng giao thông đường thuỷ, đường bộ hoặc đường không. Bài toán lập lịch thi công các công đoạn trong một công trình thi công lớn. Bài toán lựa chọn đường truyền tin với chi phí nhỏ nhất trong mạng thông tin... Dùng thuật giải đường đi ngắn nhất trong đồ thị giải quyết bài toán sửa gói tin sai trong việc truyền tin... dưới đây ta xét một số thuật toán để tìm đường đi ngắn nhất trong đồ thị có trọng số và đồ thị không có trọng số.