Thuật toán dijkstra tìm đường đi ngắn nhất
 Về mặt ý nghĩa, cả 2 thuật toán đều thực hiện trên đồ thị không có trọng số.
 Thuật toán DFS cho ta tìm đường đi đến đỉnh ta muốn (có thể chưa ngắn nhất).
 Còn thuật toán BFS cũng tìm đường đi đến đỉnh ta muốn nhưng là đường ngắn nhất có thể.
 Trong đồ thị có trọng số, vấn đề sẽ khó hơn, nó nảy sinh ra 1 bài toán, đó là bài toán tìm đường đi ngắn nhất giữa 2 đỉnh.
 Nó là bài toán rất quen thuộc với những người bắt đầu học Graph.
 Để giải quyết bài toán này, đến giờ có nhiều thuật toán và các biến thể. Trong bài viết này mình sẽ chắc lọc và lựa chọn sử dụng Moore – Dijkstra.
 Thuật toán Dijkstra cho phép tìm đường đi ngắn nhất từ một đỉnh s
đến các đỉnh còn lại của đồ thị và chiều dài (trọng số) tương ứng.
 Phương pháp của thuật toán là xác định tuần tự đỉnh có chiều dài đến s
theo thứ tự tăng dần.
 Thuật toán được xây dựng trên cơ sở gán cho mỗi đỉnh các nhãn tạm thời.
 Nhãn tạm thời của các đỉnh cho biết cận trên của chiều dài đường đi ngắn nhất từ s
đến đỉnh đó.
 Nhãn của các đỉnh sẽ biến đổi trong các bước lặp, mà ở mỗi bước lặp sẽ có một nhãn tạm thời trở thành chính thức.
 Nếu nhãn của một đỉnh nào đó trở thành chính thức thì đó cũng chính là chiều dài ngắn nhất của đường đi từ s
đến đỉnh đó.
2. Ý tưởng và Mô tả thuật toán Dijkstra để tìm đường đi ngắn nhất
 Như bạn đã biết, thuật toán của Dijkstra là một thuật toán Greedy (Thuật toán tham lam)
 Điều này có nghĩa là chúng ta sẽ đi một con đường ngắn hơn từ đỉnh này đến đỉnh kia. Thuật toán hoàn tất khi chúng ta truy cập tất cả các đỉnh của đồ thị.
 Tuy nhiên, hãy cẩn thận – đôi khi khi chúng ta tìm thấy một đỉnh mới, có thể có các đường đi ngắn hơn qua nó từ một đỉnh đã truy cập đến một đỉnh đã được truy cập khác.
 Chúng ta có thể xem bên dưới các bước để hoàn thành thuật toán Dijkstra.
 Chúng ta có thể bắt đầu với nút A
và chúng ta có 2 con đường.
- Đầu tiên là từ
A
đếnB
với độ dài5
V
à từA
đếnC
với độ dài3
.
 Vì vậy, chúng ta có thể viết trong danh sách kế bên với các đỉnh đã truy cập là 2 đỉnh mới (B
, C
) và trọng số để đến đó.
 Sau đó, như đã nói trước đó – chúng ta sẽ chọn con đường từ A
->
C
.
 Khi truy cập vào đỉnh C
, chúng ta có thể thấy rằng có 3 đường đi khác nhau:
- Con đường đầu tiên là
C
đếnB
- Con đường thứ hai là
C
đếnD
- Con đường thứ ba là
C
đếnE
 Vì vậy, hãy ghi vào danh sách hai đỉnh mới và chọn con đường ngắn nhất là C
đến B
.
 Bây giờ tại B
, chúng ta có 3 đường:
B
đếnD
B
đếnE
- Và
B
quay lạiC
 Chúng ta chọn con đường ngắn nhất là B
đến D
và chúng ta cập nhật vào danh sách trọng số mới của các đường đi từ A
đến các đỉnh khác.
 Bây giờ như chúng ta có thể thấy không có đường đi mới nào từ D
đến E
.
 Trong trường hợp đó, chúng ta quay lại đỉnh trước đó để kiểm tra đường đi ngắn nhất.
 Bây giờ có một đường với độ dài 4
đi đến E
và một đường đi đến C
.
 Trong trường hợp này, chúng ta chọn bất kỳ đường nào chúng ta thích.
 Cuối cùng, chúng ta có thể thấy rằng bất kỳ phương án nào chúng ta đi trên đường từ A
đến E
đều có trọng số như nhau vì các đường đi ngắn nhất được ghi trong danh sách.
 Cuối cùng, chúng ta có thể thấy tất cả các đường đi mà chúng ta đã sử dụng.
3. Triển khai thuật toán tìm đường đi ngắn nhất trong Java
 File Vert.java
 File Edge.java
 File PathFinder.java
+ edge.getWeight();
 File Dijkstra.java
System.out.println(“Khoảng cách tối thiểu từ:”);
 Khi chạy chương trình, kết quả ta nhận được là:
A đến B: 5.0
A đến C: 3.0
A đến D: 8.0
A đến E: 9.0
Đương đingắn nhất từ:
A đến B: [A, B] A đến C: [A, C] A đến D: [A, C, D] A đến E: [A, C, E]
 Dijkstra là thuật toán tìm đường đi có thể nói là đơn giản nhất.
 Trong đồ thị, còn nhiều giải thuật tìm đường đi khác, tuỳ vào trường hợp và mục đích sử dụng mà bạn có thể dành thời gian tìm hiểu để nâng cao trình độ của mình như:
 Giải bài toán đường đi ngắn nhất nguồn đơn (simple-source): Ta sẽ tìm đường đi ngắn nhất từ đỉnh nguồn v đến tất cả các đỉnh khác. Có 2 thuật toán quan trọng: Thuật toán Dijkstra (Đối với trọng số dương) và Thuật toán Bellman-Ford (Đối với trọng số bất kỳ).
 Giải bài toán đường đi ngắn nhất nguồn đích (simple-destination): Ta sẽ tìm đường đi ngắn nhất trong đồ thị có hướng từ các đỉnh đến đỉnh đích v
. Ta có thể giải quyết bằng cách đảo ngược hướng của đồ thị và trở thành bài toán nguồn đơn.
 Giải bài toán đường đi ngắn nhất cho mọi cặp đỉnh: Ta sẽ tìm đường đi ngắn nhất giữa 2 đỉnh bất kỳ. Có 2 thuật toán quan trọng: Thuật toán Floyd-Warshall và Thuật toán Johnson.
 Như vậy, qua bài hướng dẫn này bạn đã tìm hiểu được một cách để giải bài toán tìm đường đi ngắn nhất (Shortest path).
 Đến đây, bạn cũng đã được học về các thuật toán Bubble sort, Selection sort, Insertion sort, Quick sort, Merge sort, Heap sort, Binary search và cả Shortest path nữa.