Bài toán đường đi ngắn nhất là một trong những bài toán cơ bản và quan trọng trong lĩnh vực tối ưu hóa và lý thuyết đồ thị. Bài toán yêu cầu tìm đường đi có tổng trọng số nhỏ nhất từ một điểm xuất phát đến một điểm đích trong một đồ thị có hướng hoặc vô hướng, với các cạnh mang trọng số dương.
Giả sử bạn có một mạng lưới các thành phố kết nối với nhau bằng các tuyến đường, mỗi tuyến đường có độ dài cụ thể. Yêu cầu là tìm tuyến đường ngắn nhất từ thành phố A đến thành phố B.
Bài toán này có nhiều ứng dụng thực tế trong các lĩnh vực:
Dijkstra là một thuật toán nổi tiếng được dùng để giải bài toán đường đi ngắn nhất trên đồ thị không có trọng số âm.
distance[]
với giá trị vô cực (INF
) cho tất cả các điểm, trừ điểm xuất phát là 0
.$graph = [
'A' => ['B' => 1, 'C' => 4],
'B' => ['C' => 2, 'D' => 5],
'C' => ['D' => 1],
'D' => []
];
function dijkstra($graph, $start, $end) {
$dist = [];
$prev = [];
$queue = [];
foreach ($graph as $node => $edges) {
$dist[$node] = INF;
$prev[$node] = null;
$queue[$node] = true;
}
$dist[$start] = 0;
while (!empty($queue)) {
// Tìm node có khoảng cách nhỏ nhất
$minDist = INF;
$minNode = null;
foreach ($queue as $node => $_) {
if ($dist[$node] < $minDist) {
$minDist = $dist[$node];
$minNode = $node;
}
}
if ($minNode === null) break; // Không còn đường đi
if ($minNode === $end) break; // Đã đến đích
foreach ($graph[$minNode] as $neighbor => $weight) {
$alt = $dist[$minNode] + $weight;
if ($alt < $dist[$neighbor]) {
$dist[$neighbor] = $alt;
$prev[$neighbor] = $minNode;
}
}
unset($queue[$minNode]); // Đã xét xong
}
// Truy vết lại đường đi
$path = [];
for ($node = $end; $node !== null; $node = $prev[$node]) {
array_unshift($path, $node);
}
return [
'distance' => $dist[$end],
'path' => $path
];
}
$result = dijkstra($graph, 'A', 'D');
echo "Khoảng cách ngắn nhất: " . $result['distance'] . "n";
echo "Đường đi: " . implode(" → ", $result['path']);
Output:
Khoảng cách ngắn nhất: 4
Đường đi: A → B → C → D
Bài toán đường đi ngắn nhất là một trong những bài toán nền tảng trong lập trình và ứng dụng rộng rãi trong đời sống, từ định vị GPS cho đến tối ưu hóa mạng và chuỗi cung ứng. Với PHP và thuật toán Dijkstra, chúng ta có thể dễ dàng mô phỏng, thử nghiệm và áp dụng thuật toán này để giải các bài toán thực tế.