Advertisement
Guest User

Untitled

a guest
Dec 13th, 2019
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.80 KB | None | 0 0
  1. #include<iostream>
  2. #include<vector>
  3. using namespace std;
  4.  
  5. void Dijkstra (vector<vector<pair<int,int>>>&,int&);
  6.  
  7. int main(){
  8. setlocale(LC_ALL,"Russian");
  9. vector<vector<pair<int,int>>>G{ //запись данногографа
  10. {{1,1},{3,6}},
  11. {{0,1},{2,4},{3,3},{4,9},{5,8},{6,7}},
  12. {{0,6},{1,4}},
  13. {{1,3},{4,2}},
  14. {{3,2},{1,9}},
  15. {{1,8},{6,5}},
  16. {{1,7},{5,5}}
  17. };
  18. int vortex; // ввод переменной vortex
  19. cout<<"Введите номер вершины:"; // запись в vortex вершину от которой ведем поиск наименьшего пути
  20. cin>>vortex;
  21. Dijkstra(G,vortex);// вызов функции
  22.  
  23. return 0;
  24. }
  25.  
  26. void Dijkstra(vector<vector<pair<int,int>>>&myG,int&s){// описание функции ввод графа и вершины отсчета
  27. const int inf =2000000000; //задаем значение infinity  
  28. size_t n =myG.size(); // присваиваем н длину G
  29. vector<size_t>D(n,inf); // создание вектора D длинной n и со значениями inf, для хранения кратчайших путей в графе от вершины
  30. vector<size_t>P(n); // создание вектора P с длиной n, для хранения промежуточных значений длин путей
  31. vector<bool>U(n,false); // создание вектора длиной n со значениями false для того, чтобы отметить пройденные вершины
  32. D[s]=0;// присваиваем исходной вершине значение 0
  33. for(size_t i=0;i<n;i++){
  34. size_t v=1000000000;// Определяем максимальное значение стартовой вершины
  35. for(size_t j=0;j<n;j++)
  36. if(!U[j]&&(v==1000000000||D[j]<D[v]))// если вершина не помечена, имеет максимальное значение или D[j]<D[v], то
  37. v=j;// значению вершины присваивается j
  38. if(D[v]==inf)// если значение вершины не изменилось, то переходим к следующей
  39. break;
  40. U[v]=true;// помечаем вершину как пройденную
  41. auto beg=myG[v].begin();//присваиваем beg первый элемент myG[v]
  42. auto lst=myG[v].end();// присваиваем lst последний элемент myG[v]
  43. while(beg!=lst){// поиск наименьшего пути
  44. auto to=beg->first;
  45. auto len=beg->second;
  46. if(D[v]+len<D[to]){// выбор лучшего значения + длины до некоторой вершины и прямого пути до некоторой вершины
  47. D[to]=D[v]+len;
  48. P[to]=v;
  49. }
  50. beg++;// рассматриваем следующую вершину
  51. }
  52. }
  53. for(auto&r:D)//вывод вектора
  54. cout<<r<<"";
  55. cout<<endl;
  56. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement