Advertisement
Guest User

Untitled

a guest
May 21st, 2019
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.74 KB | None | 0 0
  1. #include <string>
  2. #include <vector>
  3. #include <fstream>
  4. #include <sstream>
  5. #include <iostream>
  6. using namespace std;
  7.  
  8. #define INF 777 //деяке число для позначення безкінечності
  9.  
  10. typedef struct { //структура ребра
  11. int src, dest, weight;
  12. } edge;
  13.  
  14. typedef struct { //структура графу
  15. int V, E;
  16. edge *arr;
  17. } graph;
  18. int a, b, c,
  19. n,m,
  20. total =0;
  21. graph *newgraph(int V, int E) { //функція створення графу з V вершин і E ребер
  22. graph *current = (graph *)malloc(sizeof(graph));
  23. current->V = V;
  24. current->E = E;
  25. current->arr = (edge *)malloc(sizeof(edge)* E);
  26. return current;
  27. }
  28.  
  29. int **adjmat(graph *g) { //функція створення матриці суміжності(функции c++ - шные)
  30. int **ret = new int*[g->V];
  31. for (int i = 0; i < (g->V); i++)
  32. {
  33. ret[i] = new int[g->V];
  34. for (int j = 0; j < (g->V); j++) {
  35. ret[i][j] = 0;
  36. }
  37. }
  38. for (int i = 0; i < (g->V); i++)
  39. {
  40. for (int j = 0; j < (g->V); i++)
  41. cout << ret[i][j] << " ";
  42. cout << endl;
  43. }
  44. for (int i = 0; i < g->E; i++) {
  45. int u = g->arr[i].src;
  46. int v = g->arr[i].dest;
  47. int w = g->arr[i].weight;
  48. ret[u][v] = w;
  49. ret[v][u] = w;
  50. }
  51. return ret;
  52. }
  53. void printPath(int parent[], int j) //вывод кратчайшего пути(хотя бы должен быть им)
  54. {
  55. if (parent[j] == -1)
  56. return;
  57.  
  58. printPath(parent, parent[j]);
  59.  
  60. printf("%d ", j);
  61. }
  62.  
  63.  
  64.  
  65. int *Dijkstra(int **GR, int V, int st) //функция с алгоритмом Дейкстры, возвращает массив с кратчайшими расстояниями
  66. {
  67. int *distance, count, index, i, u;
  68. bool *visited;
  69. distance = new int[V];
  70. visited = new bool[V];
  71. for (i = 0; i<V; i++) { distance[i] = INF; visited[i] = false; }
  72. distance[st] = 0;
  73. for (count = 0; count<V - 1; count++)
  74. {
  75. int min = INF;
  76. for (i = 0; i<V; i++)
  77. if (!visited[i] && distance[i] <= min) { min = distance[i]; index = i; }
  78. u = index;
  79. visited[u] = true;
  80. for (i = 0; i<V; i++)
  81. if (!visited[i] && GR[u][i] && distance[u] != INF &&
  82. distance[u] + GR[u][i]<distance[i])
  83. distance[i] = distance[u] + GR[u][i];
  84. }
  85. int temp_i, temp = 0;
  86. for (int i = 0; i < V; i++) //выбор наименьшего веса из всех маршрутов
  87. {
  88. temp = distance[0];
  89. if (distance[i]>temp)
  90. {
  91. temp = distance[i];
  92. temp_i = i;
  93. }
  94. }
  95. int* path = new int;
  96. for (int i = 0; i < V; i++)
  97. path[i] = -1;
  98. printPath(path, temp_i); //вызов функции печати пути
  99.  
  100.  
  101. return distance;
  102. }
  103. void output(graph *&g) //функція створення файлу з вихідними даними(нужно, чтобы выводило путь с наименьшим весом )
  104. {
  105. int **mat = adjmat(g);
  106. int* distance = Dijkstra(mat, g->V, 1);
  107. ofstream file;
  108. file.open("output.txt");
  109. if (!file.is_open())
  110. {
  111. cout << "Файл не удалось открыть" << endl;
  112. return;
  113. }
  114. else
  115. {
  116. for (int i = 0; i < g->V; i++)
  117. {
  118. file << distance[i];
  119. file << " ";
  120. }
  121. }
  122.  
  123. }
  124.  
  125. graph* input_data() //ввод данных с файла - первая строка - число вершин и ребер, дальше идут ребра с весами
  126. {
  127. FILE* is;
  128. is = fopen("data.txt", "rt");
  129. fscanf(is, "%d%d", &n, &m);
  130. graph *g = newgraph(n, m ); //створення графу
  131. for (int i = 0; i < m; i++)
  132. {
  133. fscanf(is, "%d%d%d", &a, &b, &c);
  134. g->arr[i].src = a - 1;
  135. g->arr[i].dest = b - 1;
  136. g->arr[i].weight = c;
  137. }
  138. fclose(is);
  139. return g;
  140. }
  141. void main()
  142. {
  143.  
  144. graph* tree = input_data();
  145. //вызовы функций
  146. output(tree);
  147.  
  148. system("pause");
  149.  
  150. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement