Trước khi các thành viên giải bài này bằng viết thủ tục, chúng ta sẽ nghiên cứu từng bước làm bằng tay để hiểu thuật toán. Thông thường, trong bài thi việc trình bày bằng tay cũng được số điểm không phải là quá ít (bao giờ cũng có 1 phần, dành cho việc làm bằng tay này). Chúng ta phải làm như thế nào.
Làm mẫu cái đề thi năm 2007 theo cách làm mà sách hướng dẫn (trang 95, 96, sách ôn thi Cao học ngành CNTT, HV KTQS năm 2005).
Đầu tiên là các ký hiệu:
U: Đỉnh hiện tại. Việc xét khoảng cách từ một
đỉnh gốc (trong đề này là m) đến một
đỉnh đích (trong đề này là c), được chia ra các công đoạn (bước). Mỗi bước, ta có 1 đỉnh hiện tại làm căn cứ, phải chọn trong số các đỉnh kề của nó mà chưa có trong tập V*, đỉnh nào có trọng số ít nhất. Tính khoảng cách từ đỉnh gốc (là m) đến đỉnh này. Đưa đỉnh này vào tập V* để các lần tính sau không xét khoảng cách quay lại đỉnh này nữa.
Giá trị từng ô của bảng này là khoảng cách từ đỉnh gốc m tới đỉnh cần xét.
Nếu đề thi cho ở dạng danh sách kề, thì làm luôn bước này, nhưng nếu đề thi cho ở dạng đồ hình, ta phải lập danh sách kề trước.
Làm bằng tay, đầu tiên ta viết vào bài làm:
Tìm đường đi ngắn nhất P* (m, c)
Sau đó kẻ bảng có n 4 cột (n là số đỉnh của đồ thị). Cột 1 ghi “
Bước”, cột 2 ghi “
U”, cột 3 bỏ trống cho đẹp, tránh lẫn dữ liệu. Từ cột 4 trở đi ghi lần lượt các đỉnh, nên ghi theo thứ tự đường đi (đừng có ghi lung tung kẻo khó khăn trong việc xét và nhầm lẫn), cột đầu tiên là cột gốc, cột sau cuối của các đỉnh là đích. Cột cuối cùng của bảng ghi “
Tập V* ”
Trong bài này ta có 12 đỉnh a, b, c, d, e, f, g, h, i, j, k, m nên phải kẻ tới 16 cột.
Tại bước 0, xác định U chính là m nên ta điền vào bảng tại đỉnh m là 0. Các đỉnh còn lại điền thành ∞. Đưa m vào tập V*.
Bước
| U
|
| m
| k
| j
| h
| i
| e
| c
| a
| b
| d
| f
| g
| Tập V*
|
|
|
| 0
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞ |
Bước 1. Chọn đỉnh U chính là m, nên ta điền tại m khoảng cách là 0. Kiểm tra danh sách đỉnh kề của m xem bằng bao nhiêu thì điền vào. Nếu không phải danh sách kề của m, điền ∞. Do các khoảng cách từ m chỉ có tới k là nhỏ nhất (bằng 2) nên ta sẽ chọn k làm U ở bước kế tiếp. Đưa k bổ sung vào tập V*.
Bước
| U
|
| m
| k
| j
| h
| i
| e
| c
| a
| b
| d
| f
| g
| Tập V*
|
0
|
|
| 0
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞
|
|
1
| m
|
| 0
| 2
| ∞
| 6
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞
| 6
| m
|
Bước 2. Chọn đỉnh U là k, lại kiểm trong danh sách đỉnh kề của k. Lấy trọng số của các đỉnh kề này, cộng với khoảng cách từ m tới k (chính là số 2), được bao nhiêu điền vào. Nếu không phải danh sách kề của k, điền ∞. Nếu đỉnh đã có trong tập V*, bỏ trống (Vì không ai điên mà tính quay lại các đỉnh đã đi qua làm gì). Do các khoảng cách từ m chỉ có tới j là nhỏ nhất (bằng 3) nên ta sẽ chọn j làm U ở bước kế tiếp. Đưa j bổ sung vào tập V*.
Bước
| U
|
| m
| k
| j
| h
| i
| e
| c
| a
| b
| d
| f
| g
| Tập V*
|
0
|
|
| 0
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞
|
|
1
| m
|
| 0
| 2
| ∞
| 6
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞
| 6
| m
|
2
| k
|
|
| 2
| 3
| 6
| 7
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞
| 7
| m, k
|
Bước 3, 4, 5... Tương tự lập luận như bước 2.
Bước 6. Do đỉnh e là đỉnh kề với c nên kết thúc luôn.
Bước
| U
|
| m
| k
| j
| h
| i
| e
| c
| a
| b
| d
| f
| g
| Tập V*
|
0
|
|
| 0
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞
|
|
1
| m
|
| 0
| 2
| ∞
| 6
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞
| 6
| m
|
2
| k
|
|
| 2
| 3
| 6
| 7
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞
| 7
| m, k
|
3
| j
|
|
|
| 3
| 5
| 9
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞
| ∞
| m, k, j
|
4
| h
|
|
|
|
| 5
| 6
| 9
| ∞
| ∞
| ∞
| ∞
| 10
| 7
| m, k, j, h
|
5
| i
|
|
|
|
|
| 6
| 8
| ∞
| ∞
| ∞
| 12
| ∞
| ∞
| m, k, j, h, i
|
6
| e
|
|
|
|
|
|
| 8
| 10
| 9
| 11
| 9
| 10
| ∞
| m, k, j, h, i, e
|
7
| c
|
|
|
|
|
|
|
| 10
|
|
|
|
|
| m, k, j, h, i, e, c
|
Vậy đường đi ngắn nhất từ m đến c theo thuật toán Dijkastra là (m, k, j, h, i, e, c)