Advertisement
Guest User

Untitled

a guest
Mar 21st, 2019
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.74 KB | None | 0 0
  1. #include "ReadWriter.h"
  2. #include "climits"
  3. //string, fstream, iostream, vector, Edge.h - included in ReadWriter.h
  4.  
  5. //Можно создавать любые классы и методы для решения задачи
  6.  
  7. using namespace std;
  8.  
  9. //method for finding vertex with minimal distance
  10. int findNext(int N, bool *visited, const int *distance) {
  11.  
  12. int i = 0, minimum = INT_MAX;
  13.  
  14. for (int j = 0; j < N; j++)
  15. if (!visited[j] && distance[j] <= minimum) {
  16. minimum = distance[j];
  17. i = j;
  18. }
  19. visited[i] = true;
  20. return i;
  21. }
  22.  
  23. //Основной метод решения задачи, параметры:
  24. //N - количество вершин, M - количество ребер в графе
  25. //edges - вектор ориентированных ребер, каждое ребро представлено 3-мя числами (А, В, W),
  26. // где A и B - номера вершин, которые оно соединяет (Путь строго из А в В), и W - вес ребра
  27. //передается по ссылке (&), чтобы не копировать, изменять вектор и его значения можно.
  28. //Результат также в виде вектора кратчайших расстояний из 0-й вершины во все остальные начиная с 1-й, то есть N-1 значение должно быть
  29. void solve(int N, int M, vector<Edge> &edges, vector<int> &result) {
  30.  
  31. int **graph = new int *[N];
  32. bool *visited = new bool[N];
  33. int *distance = new int[N];
  34.  
  35. for (int i = 0; i < N; i++) {
  36. graph[i] = new int[N];
  37.  
  38. for (int j = 0; j < N; j++)
  39. graph[i][j] = 0;
  40.  
  41. visited[i] = false;
  42. distance[i] = INT_MAX;
  43. }
  44.  
  45. //setting weight for each point
  46. for (int i = 0; i < edges.size(); i++) {
  47. graph[edges[i].A][edges[i].B] = edges[i].W;
  48. }
  49.  
  50. //Dijkstra algorithm
  51. int count = 1;
  52. distance[0] = 0;
  53.  
  54. while (count++ < N) {
  55.  
  56. int curV = findNext(N, visited, distance);
  57.  
  58. for (int newV = 0; newV < N; ++newV)
  59. if (!visited[newV] && graph[curV][newV] != 0 && distance[curV] != INT_MAX) {
  60. int path = distance[curV] + graph[curV][newV];
  61. if (path < distance[newV])
  62. distance[newV] = path;
  63. }
  64. }
  65.  
  66. for (int i = 1; i < N; ++i) {
  67. result.push_back(distance[i]);
  68. }
  69.  
  70. delete[] distance;
  71. delete[] visited;
  72. for (int i = 0; i < N; i++)
  73. delete[] graph[i];
  74. delete[] graph;
  75.  
  76.  
  77. }
  78.  
  79. int main() {
  80. ReadWriter rw;
  81. //Входные параметры
  82. //N - количество вершин, M - количество ребер в графе
  83. int N, M;
  84. rw.read2Ints(N, M);
  85.  
  86. //Вектор ребер, каждое ребро представлено 3-мя числами (А, В, W), где A и B - номера вершин, которые оно соединяет, и W - вес ребра
  87. //Основной структурой выбран вектор, так как из него проще добавлять и удалять элементы (а такие операции могут понадобиться).
  88. vector<Edge> edges;
  89. rw.readEgdes(M, edges);
  90.  
  91. //Основной структурой для ответа выбран вектор, так как в него проще добавлять новые элементы.
  92. vector<int> result;
  93.  
  94. //Алгоритм решения задачи
  95. solve(N, M, edges, result);
  96.  
  97. //Выводим результаты
  98. rw.writeInt(result.size());
  99. rw.writeIntValues(result);
  100.  
  101. return 0;
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement