Guest User

Untitled

a guest
May 20th, 2018
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.53 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. int main()
  6. {
  7. const int SIZE = 6;
  8. int a[SIZE][SIZE]; // матрица связей
  9. int d[SIZE]; // минимальное расстояние
  10. int v[SIZE]; // посещенные вершины
  11. int temp;
  12.  
  13. // Инициализация матрицы связей
  14. for (int i = 0; i<SIZE; i++)
  15. {
  16. a[i][i] = 0;
  17. for (int j = i + 1; j<SIZE; j++) {
  18. cout << i + 1 << " - " << j + 1
  19. scanf("%d", &temp);
  20. a[i][j] = temp;
  21. a[j][i] = temp;
  22. }
  23. }
  24. // Вывод матрицы связей
  25. for (int i = 0; i<SIZE; i++)
  26. {
  27. for (int j = 0; j<SIZE; j++)
  28. printf("%5d ", a[i][j]);
  29. printf("\n");
  30. }
  31. //Инициализация вершин и расстояний
  32. for (int i = 0; i<SIZE; i++) {
  33. d[i] = 10000;
  34. v[i] = 1;
  35. }
  36. d[0] = 0;
  37. // Шаг алгоритма
  38. do {
  39. minindex = 10000;
  40. min = 10000;
  41. for (int i = 0; i<SIZE; i++)
  42. { // Если вершину ещё не обошли и вес меньше min
  43. if ((v[i] == 1) && (d[i]<min))
  44. { // Переприсваиваем значения
  45. min = d[i];
  46. minindex = i;
  47. }
  48. }
  49. // Добавляем найденный минимальный вес
  50. // к текущему весу вершины
  51. // и сравниваем с текущим минимальным весом вершины
  52. if (minindex != 10000)
  53. {
  54. for (int i = 0; i<SIZE; i++)
  55. {
  56. if (a[minindex][i] > 0)
  57. {
  58. temp = min + a[minindex][i];
  59. if (temp < d[i])
  60. {
  61. d[i] = temp;
  62. }
  63. }
  64. }
  65. v[minindex] = 0;
  66. }
  67. } while (minindex < 10000);
  68. // Вывод кратчайших расстояний до вершин
  69. printf("\nКратчайшие расстояния до вершин: \n");
  70. for (int i = 0; i<SIZE; i++)
  71. printf("%5d ", d[i]);
  72.  
  73. // Восстановление пути
  74. int ver[SIZE]; // массив посещенных вершин
  75. int end = 4; // индекс конечной вершины = 5 - 1
  76. ver[0] = end + 1; // начальный элемент - конечная вершина
  77. int k = 1; // индекс предыдущей вершины
  78. int weight = d[end]; // вес конечной вершины
  79.  
  80. while (end > 0) // пока не дошли до начальной вершины
  81. {
  82. for(int i=0; i<SIZE; i++) // просматриваем все вершины
  83. if (a[end][i] != 0) // если связь есть
  84. {
  85. int temp = weight - a[end][i]; // определяем вес пути из предыдущей вершины
  86. if (temp == d[i]) // если вес совпал с рассчитанным
  87. { // значит из этой вершины и был переход
  88. weight = temp; // сохраняем новый вес
  89. end = i; // сохраняем предыдущую вершину
  90. ver[k] = i + 1; // и записываем ее в массив
  91. k++;
  92. }
  93. }
  94. }
  95. // Вывод пути (начальная вершина оказалась в конце массива из k элементов)
  96. printf("\nВывод кратчайшего пути\n");
  97. for (int i = k-1; i>=0; i--)
  98. printf("%3d ", ver[i]);
  99. cin.get();
  100. cin.get();
  101. return 0;
  102. }
Add Comment
Please, Sign In to add comment