Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Найти кратчайший путь от вершины 0 к вершине б с помощью алгоритма Дейкстры

Ева Андрианова Ученик (98), на голосовании 4 месяца назад
помогите пожалуйста решить задачу по информатике. подробно
Голосование за лучший ответ
AaacoB Aaac Мудрец (14214) 5 месяцев назад
это не информатика, а элементарная транспортная задача... и от 0 к 6 тока 2 варианта... фуйле тут не найти!: 0-3-6.
Татьяна Просветленный (36374) 5 месяцев назад
Так как размещено в разделе программирования С++ и ответ такой же будет по этому разделу.
Для решения задачи поиска кратчайшего пути с использованием алгоритма Дейкстры, давайте напишем программу на 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;
}
ТатьянаПросветленный (36374) 5 месяцев назад
Результат выполнения
Похожие вопросы