Advertisement
Guest User

Untitled

a guest
Jun 25th, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.61 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. const int INF = 100000;
  8.  
  9. int Dejk(int start, int end, int **a, int n)
  10. {
  11. int *weight = new int[n]; //массив меток
  12. for (int i = 0; i < n; i++)
  13. weight[i] = INF;
  14. weight[start] = 0;
  15.  
  16. bool *status = new bool[n]; //массив статуса вершин
  17. for (int i = 0; i < n; i++)
  18. status[i] = true;
  19.  
  20. for (int i = 0; i < n; i++)
  21. {
  22. int min = INF - 1, temp = 0;
  23. for (int j = 0; j < n; j++) //цикл поиска минимальной метки
  24. if ((status[j] == true) and (weight[j] < min))
  25. {
  26. min = weight[j];
  27. temp = j;
  28. }
  29.  
  30. if (min == INF - 1)
  31. return weight[end];
  32.  
  33. for (int j = 0; j < n; j++)
  34. if ((a[temp][j] != INF) and (a[temp][j] + weight[temp] < weight[j])) //если элемент в матрице не равен 0 (т.е. из него есть путь) и если общее расстояние пути от изначальной вершины меньше метки
  35. weight[j] = a[temp][j] + weight[temp];
  36. status[temp] = false;
  37. }
  38.  
  39.  
  40. return weight[end];
  41. }
  42.  
  43. int main()
  44. {
  45. int n, start, end;
  46. cin >> n >> start >> end;
  47. start--;
  48. end--;
  49. int **a;
  50. a = new int*[n]; //создаём двумерный массив
  51. for (int i = 0; i < n; i++)
  52. a[i] = new int[n];
  53.  
  54. for (int i = 0; i < n; i++)
  55. for (int j = 0; j < n; j++)
  56. {
  57. cin >> a[i][j];
  58. if (a[i][j] = -1)
  59. a[i][j] = INF;
  60. }
  61.  
  62. int res = Dejk(start, end, a, n);
  63. if (res != INF)
  64. cout << res << endl;
  65. else
  66. cout << -1 << endl;
  67.  
  68. system("pause");
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement