Так как размещено в разделе программирования С++ и ответ такой же будет по этому разделу.
Для решения задачи поиска кратчайшего пути с использованием алгоритма Дейкстры, давайте напишем программу на C++ и подробно рассмотрим шаги алгоритма для графа, изображенного на рисунке.
Алгоритм Дейкстры
Инициализация: Устанавливаем расстояние до начальной вершины 0 равным 0, а до всех остальных вершин - бесконечность. Создаем множество необработанных вершин.
Обработка: Повторяем следующие шаги, пока есть необработанные вершины:
Выбираем вершину с наименьшим расстоянием.
Обновляем расстояния до соседних вершин.
Помечаем текущую вершину как обработанную.
Завершение: Когда вершина назначения будет обработана, алгоритм завершается.
Шаги программы
Создаем структуру данных для представления графа.
Реализуем алгоритм Дейкстры для поиска кратчайшего пути.
Выводим результат.
код на C++
#include
#include
#include
#include
using namespace std;
// Определение структуры для представления графа
struct Edge {
int destination;
int weight;
};
void dijkstra(const vector>& graph, int source, int destination) {
int n = graph.size();
vector distances(n, numeric_limits::max());
vector previous(n, -1);
distances[source] = 0;
// Приоритетная очередь для хранения вершин по наименьшему расстоянию
priority_queue, vector>, greater>> pq;
pq.push({0, source});
while (!pq.empty()) {
int current = pq.top().second;
int current_distance = pq.top().first;
pq.pop();
if (current_distance > distances[current]) {
continue;
}
for (const Edge& edge : graph[current]) {
int next = edge.destination;
int weight = edge.weight;
int distance = current_distance + weight;
if (distance < distances[next]) {
distances[next] = distance;
previous[next] = current;
pq.push({distance, next});
}
}
}
// Печать кратчайшего пути
if (distances[destination] == numeric_limits::max()) {
cout << "Нет пути от вершины " << source << " до вершины " << destination << endl;
} else {
cout << "Кратчайший путь от вершины " << source << " до вершины " << destination << " равен " << distances[destination] << endl;
cout << "Путь: ";
vector path;
for (int at = destination; at != -1; at = previous[at]) {
path.push_back(at);
}
for (auto it = path.rbegin(); it != path.rend(); ++it) {
cout << *it << " ";
}
cout << endl;
}
}
int main() {
// Определение графа
vector> graph(8);
graph[0] = {{1, 2}, {2, 5}};
graph[1] = {{2, 2}, {3, 3}, {4, 8}};
graph[2] = {{5, 4}};
graph[3] = {{1, 3}, {4, 2}, {6, 5}};
graph[4] = {{5, 3}, {7, 15}};
graph[5] = {{7, 10}};
graph[6] = {{7, 13}};
graph[7] = {}; // вершина 7 не имеет исходящих ребер
int source = 0;
int destination = 6;
dijkstra(graph, source, destination);
return 0;
}