Cho đồ thị G =(X,U). Giả sử G’ là đồ thị bộ phận của G. Nếu G’ =(X,U’) là một cây thì G’ gọi là cây bao trùm của đồ thị G.
Cây bao trùm ngắn nhất
-Cho đồ thị G =(X,U). Mỗi cạnh (x,y) thuộc U có trọng số c(u,v) >= 0
-G’ = (X,U’) là cây bao trùm của G
-Độ dài của cây G’ đýợc xem là tổng trọng số của các cạnh tạo thành G’
-Tìm G’ của G sao cho G’ có độ dài ngắn nhất
Thuật toán Prim
Cho G =(X,U) là đồ thi mà mỗi cạnh u thuộc U có trong số l(u)>=0
-Xác định cạnh có trọng số bé nhất trong tất cả các cạnh trong U. Giả sử là u1
-Giả sử u2 là cạnh có trọng số bé nhất trong các cạnh U \ {u1}
-Giả sử u3 là cạnh có trọng số bé nhất trong các cạnh U \{u1,u2}. Với điều kiện {u1,u2,u3} không tạo thành chu trình
– Giả sử býớc k ta đã xác định đýợc {u1,u2,u3,…,uk} có trọng số bé nhất và không tạo thành chu trình
– Thực hiện býớc n-1 thì dừng lại. Khi đó ta có {u1,u2,u3,…,un-1} không tạo thành chu trình và có trọng số bé nhất.
– Khi đó ta có G’ =(X,Un-1) là cây bao trùm bé nhất của G cần tìm
Thuật toán Prim (tiếp…)
– Cho đồ thị G = (X,U)
– Gọi X’ là tập các đỉnh kề các cạnh trong G’
– Ban đầu X chứa một đỉnh tuỳ ý trong G giả sử x, tập các cạnh G’ rỗng
– Ở mỗi býớc ta chọn cạnh (x,y) ngắn nhất sao cho x X’ và y X-X’. Thêm y vào X’ và thêm (x,y) vào G’
– Ti ếp t ục phát tri ển G’ cho đ ến khi X’ =X. Khi đó G’ tr ở thành cây bao trùm ng ắn nh ất c ủa G
Thuật toán Prim (tiếp…)
- X ={x} (x: đỉnh tuỳ ý thuộc X)
- G =
- Th ực hi ện các bý ớc sau cho đ ến khi X’=X
- Ch ọn c ạnh (x,y) có tr ọng s ố nh ỏ nh ất v ới x X’, y X-X’
- X’ = X’ {x}
- G’ =G’ {(x,y) }
3. Đýờng đi ngắn nhất
- Tìm đýờng đi ngắn nhất từ một đỉnh nguồn tới các đỉnh các đỉnh còn lại của đồ thị
- Tìm đýờng đi ngắn nhất giữa một cặp đỉnh của đồ thị
3. Đýờng đi ngắn nhất từ một đỉnh nguồn - Thuật toán Dijkstra
- Bài toán:
- Cho đồ thị G =(X,U) đõn liên thông có trọng số
- Tìm đýờng đi ngắn nhất từ đỉnh nguồn X đ ến t ất c ả các đ ỉnh còn l ại.
- Các đ ỉnh x đý ợc đánh s ố 1 t ới n
- Đ ồ th ị đý ợc bi ểu di ễn b ởi ma tr ận k ề C[1..n,1..n], trong đó C[i,j] là đ ộ dài cung (i,j) n ếu không có cung (i,j) thì C[i,j] =
3.
- Gán trọng số các đỉnh
- Trọng số của đỉnh xuất phát là t(a) = 0
- Tại các đỉnh còn lại ta ghi một trọng số dýõng t đủ lớn sao cho giá trị t này lớn hõn trọng số của các đỉnh từ a tới.
- Thực hiện việc giảm trọng số các đỉnh
- Giả sử tại đỉnh x có trọng số t(x)
- Nếu tồn tại đỉnh y có trọng số t(y) từ y đến x mà t(x) > t(y) + l(y,x) thì ta thay trọng số t(x) bởi trọng số t’(x) = t(y) + l(y,x)
- Trong trường hợp t(x) < t(y) + l(y,x) ta giữ nguyên giá trị t(x)
- Quá trình này lặp lại cho đến khi trọng số của tất cả trong G=(X,U) đạt giá trị cực tiểu nghĩa là với mọi x thuộc X không tồn tại y thuộc X kề với x mà t(y) + l(y,x) < t(x)
1. Ta xác định đường đi ngắn nhất từ đỉnh nguồn tới các đỉnh còn lại qua các bước, mỗi bước ta xác định đường đi ngắn nhất từ đỉnh nguồn tới một đỉnh trong đồ thị
2. Lưu các đỉnh mà đường đi ngắn nhất tới chúng đã được xác định vào tập S
3. Ban đầu tập S chỉ chứa đỉnh nguồn
4. Ta gọi các đường đi từ đỉnh nguồn tới các đỉnh u khác nhưng chỉ đi qua các đỉnh nằm trong S là đường đi đặc biệt
5. Dùng mảng D[2..n], trong đó D[u] lưu độ dài đường đi đặc biệt ngắn nhất từ đỉnh nguồn tới u
6. Ban đầu S chứa đỉnh 1 (đỉnh nguồn), ta xác định D[u] = C[1,u] (u =2,…n)
7. Tại mỗi bước ta sẽ chọn một đỉnh x Î X-S mà D[x] là nhỏ nhất và thêm x vào S
8. Sau khi thêm x vào S, ta xác định lại các D[y] với y Ï S. Nếu độ dài đường đi đặc biệt qua đỉnh x (vừa được chọn) tới y mà nhỏ hơn D[y] thì ta lấy D[y] làm độ dài đường đi đó
9. Khi S = X thì D[u] sẽ lưu độ dài đường đi ngắn nhất từ 1 tới u với u =2…n
10. Để lưu vết của đường đi ta sử dụng mảng P[2..n], trong đó P[y] =x nếu ta đi tới y theo cung (x,y)
3. Thuật toán Dijkstra (tiếp…)
• Disjktra;
1. S = {1};
2. For i = 2 to n do
1. D[i] = C[1,i];
2. P[i]=1;
3. While X-S ¹ Æ do
1. Chọn x Î X- S mà D[x] nhỏ nhất;
2. S =S È {x}
4. For y Î X- S do
1. If D[x] +C[x,y] < D[y] then
1. D[y] = D[x] +C[x,y];
2. P[y]=x;