Để liệt kê chu trình Hamilton và đường đi Hamilton cho tới nay người ta vẫn chưa tìm ra được thuật toán trong trường hợp tổng quát. Chính vì vậy chủ yếu dựa trên thuật toán xác định bằng hoán vị vòng quanh với tư tưởng thuật toán đệ quy, quay lui hoặc dựa trên các quy tắc để xác định chu trình Hamilton (H) của đồ thị.
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
Các quy tắc:
(1) Nếu có 1 đỉnh bậc 2 thì hai cạnh của đỉnh này bắt buộc phải nằm trong H (2) Không được có chu trình con (độ dài nhỏ hơn n) trong H
(3) Ứng với một đỉnh nào đó, nếu đã chọn đủ 2 cạnh vào H thì phải loại bỏ tất cả các cạnh còn lại (vì không thể chọn thêm).
Sau đây luận văn đi tìm hiểu về thuật toán đệ quy:
Thuật toán áp dụng đối với đồ thị được lưu giữ bằng danh sách kề ke(v).
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])
Bước 1: Bắt đầu đi từ đỉnh 1, x[1]:= 1
Bước 2: Lặp
2.1 Tìm và lưu đỉnh j có cạnh nối với x[i] và đỉnh j này chưa thăm trước đó.
2.2 Nếu đỉnh j này là x[n] và giữa j và x[1] có cạnh nối thì ghi nhận. 2.3 Nếu đỉnh j vẫn chưa phải là x[n] thì quay lại bước 2.
2.4 Quay lui nếu không đi tiếp được nữa
2.5 Bước lặp kết thúc khi đã thử mọi khả năng
Thuật toán đệ quy cho ta lời giải chính xác và tìm tất cả các chu trình Hamilton (nếu có) của đồ thị G.
Ví dụ: Cho đồ thị Đồ thị vô hướng G gồm 5 đỉnh và 6 cạnh
5 6 1 2 1 3 1 5 2 4 3
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ 1 4 2 4 2 5 3 5 Hình 2.5. Đồ thị G gồm 5 đỉnh, 6 cạnh
Chu trình Hamilton thu được: 135241; 142531
Hình 2.6. Cây liệt kê chu trình Hamilton theo thuật toán quay lui 1 2 3 4 5 4 5 1 3 1 2 4 1 2 5 3 1
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
Ví dụ 2
Hình 2.7. Đồ thị và cây liệt kê chu trình Hamilton của nó theo thuật toán quay lui.
Nhận xét: Với đồ thị có số cạnh lớn thuật toán trên sẽ không thể đáp ứng hai yêu cầu:
- Thời gian thực hiện: Độ phức tạp của thuật toán trong trường hợp xấu nhất là O(n*m) (với n là số cạnh và m là số đỉnh của đồ thị)
Kích thước bộ nhớ: do thuật toán sử dụng là thuật toán quay lui nên việc xử lý đồ thị lớn sẽ gây tràn bộ nhớ.
Kết luận: Thuật toán này chỉ có khả năng làm việc với đồ thị có số cạnh nhỏ