From 165ae55a3c7b8de89883274b126fb8aa30d628d3 Mon Sep 17 00:00:00 2001 From: anqude Date: Wed, 4 Jun 2025 03:55:55 +0000 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20main.cpp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.cpp | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 main.cpp diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..7942edb --- /dev/null +++ b/main.cpp @@ -0,0 +1,91 @@ +#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; +} \ No newline at end of file