II. Đồ thị HAMILTON
1. Các khái niệm
Trong chương này chỉ xét đồ thị có hướng G =(V,E), |V|=n, |E|=m. Mỗi cung (u,v) đặt tương ứng với một số thực a(u,v) gọi là trọng số của cung, 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 đường đi là tổng của các trọng số trên các cung của nó: ∑ = − p i i i v v a 1 1, ) (
(nếu gán trọng số cho tất cả cung bằng 1, thì độ dài của đường đi là số cung của đường đi.)
Đường đi ngắn nhất từ đỉnh s đến đỉnh t là đường đi có độ dài nhỏ nhất từ s đến t, và độ dài nhỏ nhất (còn gọi là khoảng cách) ký hiệu là d(s,t). Nếu không có đường đi từ s đến t thì đặt d(s,t)=∞.
Nếu biết d(s,t), trong trường hợp trọng số không âm, thì đường đi ngắn nhất từ s đến t có thể tìm được bằng cách để ý là đối với s, t ∈ V tuỳ ý (s ≠ t) luôn tìm được đỉnh v sao cho
d(s,t) = d(s,v) + a(v,t).
Thực vậy, đỉnh v như vậy chính là đỉnh đi trước đỉnh t trong đường đi ngắn nhất từ s đến t. Ta lại có thể tìm được đỉnh u sao cho d(s,v) = d(s,u) + a(u,v), . . . Từ đó ta có thuật toán sau đây để tìm đường đi ngắn nhất từ s đến t khi biết độ dài của nó.
void Find_Path() /*
Đầu vào:
d[v] là khoảng cách từ đỉnh s đến đỉnh v∈ V; t là đỉnh đích;
a[u,v], u, v ∈ V là ma trận trọng số trên các cung.
Đầu ra:
Mảng stack chứa dãy đỉnh xác định đường đi ngắn nhất từ s đến t */
{
stack=φ ; stack⇐ t; v=t;
while (v != s) {
u=đỉnh thoả mãn d[v]=d[u]+a[u,v]; stack⇐ u;
v=u; }
}
Nhận xét:
- Độ phức tạp tính toán của thuật toán là O(n2), do để tìm đỉnh u ta phải xét qua tất cả các đỉnh của đồ thị.
- Có thể dùng biến mảng Truoc[v], để ghi nhớ đỉnh đi trước v trong đường đi tìm kiếm (khong dùng mảng stack)