Задать вопрос

Объясните, как создать алгоритм поиска кратчайшего пути на js по графу?

Пытаюсь реализовать поиск кратчайшего пути по графу но все никак не могу додуматься как это можно сделать, смотрел и гайды и статьи но так и не доперло как оно должно работать, есть ли тут люди которые могли бы выделить немножко времени и помочь мне в этой проблеме?
  • Вопрос задан
  • 741 просмотр
Подписаться 3 Средний 1 комментарий
Пригласить эксперта
Ответы на вопрос 3
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Vindicar
@Vindicar
RTFM!
Есть классический алгоритм Дейкстры.
Что именно в нём непонятно?
Как описать граф в виде структуры данных?
Как перебирать вершины?
Ответ написан
@qDirect
// Создаем граф с помощью хэш-таблицы
const graph = {
'A': { 'B': 5, 'C': 2 },
'B': { 'A': 5, 'D': 1 },
'C': { 'A': 2, 'D': 6 },
'D': { 'B': 1, 'C': 6 }
};

function dijkstra(graph, startNode) {
// Инициализируем объекты для хранения расстояний и предшествующих узлов
const distances = {};
const previous = {};
const queue = [];

// Устанавливаем начальное расстояние в 0 и остальные в Infinity
Object.keys(graph).forEach(node => {
distances[node] = Infinity;
previous[node] = null;
queue.push(node);
});
distances[startNode] = 0;

while (queue.length > 0) {
// Находим узел с наименьшим расстоянием
const minDistanceNode = queue.reduce((minNode, node) => {
return distances[node] < distances[minNode] ? node : minNode;
});

// Удаляем текущий узел из очереди
queue.splice(queue.indexOf(minDistanceNode), 1);

// Проверяем соседей текущего узла
for (let neighbor in graph[minDistanceNode]) {
const distance = graph[minDistanceNode][neighbor];
const totalDistance = distances[minDistanceNode] + distance;

if (totalDistance < distances[neighbor]) {
// Обновляем расстояние до соседа, если оно меньше текущего
distances[neighbor] = totalDistance;
previous[neighbor] = minDistanceNode;
}
}
}

return { distances, previous };
}

// Пример использования
const startNode = 'A';
const { distances, previous } = dijkstra(graph, startNode);

console.log(distances);
console.log(previous);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы