#include #include #include #include using namespace std; const int INF = numeric_limits::max(); // Представляет "бесконечность" // Функция для поиска вершины с минимальным расстоянием int minDistance(const vector& dist, const vector& visited) { int minDist = INF; int minIndex = -1; for (size_t i = 0; i < dist.size(); ++i) if (!visited[i] && dist[i] < minDist) minDist = dist[i], minIndex = i; return minIndex; } // Алгоритм Дейкстры void dijkstra(const vector>& graph, int start, int end) { int n = graph.size(); vector dist(n, INF); // Расстояния до вершин vector parent(n, -1); // Для восстановления пути vector visited(n, false); // Посещённые вершины dist[start] = 0; for (int count = 0; count < n - 1; ++count) { int u = minDistance(dist, visited); if (u == -1) break; // Недостижимые узлы visited[u] = true; for (int v = 0; v < n; ++v) if (!visited[v] && graph[u][v] && dist[u] != INF && dist[u] + graph[u][v] < dist[v]) { dist[v] = dist[u] + graph[u][v]; parent[v] = u; } } // Восстанавливаем путь if (dist[end] == INF) { cout << "Путь из вершины " << start << " в вершину " << end << " не существует." << endl; return; } vector path; int current = end; while (current != -1) { path.push_back(current); current = parent[current]; } cout << "Кратчайший путь из вершины " << start << " в вершину " << end << ":" << endl; for (auto it = path.rbegin(); it != path.rend(); ++it) cout << *it << (next(it) != path.rend() ? " -> " : ""); cout << "\nСуммарная стоимость пути: " << dist[end] << endl; } int main() { setlocale(LC_ALL, "Russian"); int n; cout << "Введите количество вершин: "; cin >> n; vector> graph(n, vector(n)); cout << "Введите матрицу смежности (веса, 0 - отсутствие ребра):" << endl; for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) cin >> graph[i][j]; int start, end; cout << "Введите начальную вершину: "; cin >> start; cout << "Введите конечную вершину: "; cin >> end; if (start < 0 || start >= n || end < 0 || end >= n) { cout << "Ошибка: номер вершины вне диапазона!" << endl; return 1; } dijkstra(graph, start, end); return 0; }