Advertisement
Bobert0032

Пособие/«Пифагоров экспресс (для C++)»

Aug 12th, 2023 (edited)
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.11 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. struct City { // создаём структуру города, которая хранит его координаты
  7.     int x, y;
  8. };
  9.  
  10. const int INF = (int)2e9; // Устанавливаем значение, которое больше, чем любое из возможных кратчайших расстояний между городами. Оно понадобится для работы алгоритма Дейкстры
  11.  
  12. vector<City> Cities; // Массив всех городов
  13.  
  14. int dist(int a, int b) { // dist(a, b) возвращает расстояние между городами a и b. Формула для расстояния взята из условия
  15.     return (Cities[a].x - Cities[b].x) * (Cities[a].x - Cities[b].x) + (Cities[a].y - Cities[b].y) * (Cities[a].y - Cities[b].y);
  16. }
  17.  
  18. int djikstra(int s, int f) { // djikstra(s, f) возвращает минимальное расстояние между городами s и f
  19.     int n = Cities.size(); // n - кол-во городов
  20.     vector<bool> was(n); // was[i] = true, если кратчайшее расстояние от s-го города до i-го точно определено
  21.     vector<int> d(n, INF); // d[i] = x, если кратчайшее расстояние от s-го города до i-го равняется x
  22.                            // Изначально расстояние от s-го города до всех остальных = INF, чтобы во время улучшения ответа для j-го города (Когда мы делаем d[j] = min(d[j], d[v] + dist(v, j))), расстояние точно обновилось
  23.     d[s] = 0; // расстояние от изначального города до самого себя = 0
  24.     for (int i = 0; i < n - 1; ++i) { // можно не выполнять (n - 1)-ую итерацию цикла, так как на ней точно не изменятся
  25.                                       // значения массива d
  26.         int v = -1; // v - это очередной город на добавление
  27.         for (int j = 0; j < n; ++j) { // проходимся по всем городам
  28.             if (!was[j] && (v == -1 || d[v] > d[j])) { // если j-ый город не взят в множество городов, у которых точно
  29.                                                        // определено кратчайшее расстояние, и пока кандидатов на роль
  30.                                                        // v-го города нет или j-ый выгоднее предыдущего, то в качестве
  31.                                                        // v-го города берём j-ый
  32.                 v = j;
  33.             }
  34.         }
  35.         if (v == -1) break; // если больше достижимых из s-ой городов нет, то выходим из цикла
  36.         was[v] = true; // добавляем v-ый город в множество с точно установленными кратчайшими расстояниями
  37.         // пытаемся улучшить кратчайшие расстояния для городов, смежных с v-ым (Мы перебираем все города, так как по условию для любых городов a, b: можно добраться от a до b и от b до a)
  38.         for (int j = 0; j < n; ++j) { // проходимся по всем городам
  39.             // если j-ый город не принадлежит множеству городов, у которых уже определено кратчайшее расстояние, и
  40.             // текущее расстояние, до j-го города больше, чем расстояние до v-го города + кол-во времени на путь v -> j, то
  41.             // обновляем кратчайшее расстояние для j
  42.             if (!was[j]) {
  43.                 d[j] = min(d[j], d[v] + dist(v, j));
  44.             }
  45.         }
  46.     }
  47.     return d[f]; // возвращаем минимальное расстояние между городами s и f
  48. }
  49.  
  50. void solve() {
  51.     int n;
  52.     cin >> n; // считываем кол-во городов в графе
  53.     Cities.resize(n);
  54.     for (int i = 0; i < n; ++i) { // Итерируемся по всем городам из входных данных
  55.         cin >> Cities[i].x >> Cities[i].y; // считываем координаты i-го города
  56.     }
  57.     int s, f;
  58.     cin >> s >> f; // считываем начальный и конечный города
  59.     // так как нумерация городов в задаче идёт с 1, а нам удобнее, чтобы она шла с 0, уменьшаем s и f на 1
  60.     s--;
  61.     f--;
  62.     cout << djikstra(s, f); // выводим искомое время
  63. }
  64.  
  65. int main() {
  66.     solve();
  67.     return 0;
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement