Advertisement
Guest User

Untitled

a guest
Jan 20th, 2020
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.50 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. #define n 5
  5. #define SIZE 5
  6.  
  7. typedef struct list
  8. {
  9. int data;
  10. struct list *next;
  11. } list_t;
  12.  
  13. list_t *list_push(list_t *list, int data)
  14. {
  15. list_t *new_elem = malloc(sizeof(list_t));
  16.  
  17. new_elem -> next = NULL;
  18. new_elem -> data = data;
  19.  
  20. if (list == NULL)
  21. return new_elem;
  22.  
  23. list_t *ptr = list;
  24. for (; (ptr -> next) != NULL; ptr = ptr -> next)
  25. ;
  26.  
  27. ptr -> next = new_elem;
  28.  
  29. return list;
  30. }
  31.  
  32. list_t *list_elem_remove(list_t *list)
  33. {
  34. if (list -> next == NULL)
  35. {
  36. free(list);
  37. return NULL;
  38. }
  39.  
  40. list_t *ptr = list;
  41. list_t *ptr_next = list -> next;
  42.  
  43. free(ptr);
  44. return ptr_next;
  45. }
  46.  
  47. void delete_list(list_t *list)
  48. {
  49. if (list == NULL)
  50. return;
  51.  
  52. for(list_t *ptr = list; ptr != NULL;)
  53. {
  54. list_t *tmp = ptr -> next;
  55. free(ptr);
  56. ptr = tmp;
  57. }
  58.  
  59. return;
  60. }
  61.  
  62.  
  63. int deikstra(int a[n][n], int b[n][n], int begin_index, int finite_index)
  64. {
  65. int d[SIZE]; // минимальное расстояние
  66. int v[SIZE]; // посещенные вершины
  67. int r[SIZE];
  68. int temp, minindex, min, mini, temp_help;
  69.  
  70. //Инициализация вершин и расстояний
  71. for (int i = 0; i<SIZE; i++)
  72. {
  73. d[i] = 10000;
  74. v[i] = 1;
  75. r[i] = 10000;
  76. }
  77. d[begin_index] = 0;
  78. r[begin_index] = 0;
  79. // Шаг алгоритма
  80. do {
  81. minindex = 10000;
  82. min = 10000;
  83. mini = 10000;
  84. for (int i = 0; i<SIZE; i++)
  85. { // Если вершину ещё не обошли и вес меньше min
  86. if ((v[i] == 1) && (d[i]<min))
  87. { // Переприсваиваем значения
  88. min = d[i];
  89. mini = r[i];
  90. minindex = i;
  91. }
  92. }
  93. // Добавляем найденный минимальный вес
  94. // к текущему весу вершины
  95. // и сравниваем с текущим минимальным весом вершины
  96. if (minindex != 10000)
  97. {
  98. for (int i = 0; i<SIZE; i++)
  99. {
  100. if (a[minindex][i] > 0)
  101. {
  102. temp = min + (a[minindex][i] + b[minindex][i]);
  103. temp_help = mini + a[minindex][i];
  104. if (temp < d[i])
  105. {
  106. d[i] = temp;
  107. r[i] = temp_help;
  108. }
  109. }
  110. }
  111. v[minindex] = 0;
  112. }
  113. } while (minindex < 10000);
  114.  
  115. // Вывод кратчайших расстояний до вершин
  116. printf(" %d ", r[finite_index]);
  117.  
  118. for (int i = 0; i < n; i++)
  119. printf(" %d ", r[i]);
  120.  
  121. // Восстановление пути
  122. int ver[SIZE]; // массив посещенных вершин
  123. int end = SIZE - 1; // индекс конечной вершины = 5 - 1
  124. ver[0] = end + 1; // начальный элемент - конечная вершина
  125. int k = 1; // индекс предыдущей вершины
  126. int weight = r[end]; // вес конечной вершины
  127.  
  128. while (end != begin_index) // пока не дошли до начальной вершины
  129. {
  130. for (int i = 0; i < SIZE; i++) // просматриваем все вершины
  131. {//printf("%d Ok", i);
  132. if (a[end][i] != 0) // если связь есть
  133. {
  134. int temp = weight - a[end][i]; // определяем вес пути из предыдущей вершины
  135.  
  136. if (temp == r[i]) // если вес совпал с рассчитанным
  137. { // значит из этой вершины и был переход
  138. weight = temp; // сохраняем новый вес
  139. end = i; // сохраняем предыдущую вершину
  140.  
  141. ver[k] = i + 1; // и записываем ее в массив
  142. k++;
  143. }
  144. }
  145. }
  146. }
  147.  
  148. // Вывод пути (начальная вершина оказалась в конце массива из k элементов)
  149. printf("\nВывод кратчайшего пути\n");
  150. for (int i = k - 1; i >= 0; i--)
  151. printf("%3d ", ver[i]);
  152.  
  153.  
  154. return 0;
  155. }
  156.  
  157.  
  158. int main()
  159. {
  160.  
  161. int matrix_way[n][n];
  162. int matrix_cost[n][n];
  163. //int res_matrix[n][n];
  164.  
  165. int begin_index;
  166. int finite_index;
  167.  
  168. FILE *f = fopen("matrix_way.txt", "r");
  169.  
  170. if (!f)
  171. return -1;
  172.  
  173. for (int i = 0; i < n && !feof(f); i++)
  174. for (int j = 0; j < n && !feof(f); j++)
  175. fscanf(f, "%d", &matrix_way[i][j]);
  176.  
  177. FILE *file = fopen("matrix_cost.txt", "r");
  178.  
  179. if (!file)
  180. return -1;
  181.  
  182. for (int i = 0; i < n && !feof(file); i++)
  183. for (int j = 0; j < n && !feof(file); j++)
  184. fscanf(file, "%d", &matrix_cost[i][j]);
  185.  
  186. if (scanf("%d", &begin_index) != 1)
  187. return -1;
  188. if (scanf("%d", &finite_index) != 1)
  189. return -1;
  190.  
  191. //check(matrix_way);
  192. deikstra(matrix_way, matrix_cost, begin_index - 1, finite_index - 1);
  193. //find_matrix()
  194.  
  195. fclose(f);
  196. fclose(file);
  197.  
  198. return 0;
  199. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement