Advertisement
selebry

sfsdfs

Dec 30th, 2022
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.90 KB | None | 0 0
  1. #include<iostream>
  2. #include<set>
  3. #include<list>
  4. #include<limits>
  5. #include<algorithm>
  6. using namespace std;
  7.  
  8. struct Node {
  9. int dest;
  10. int cost;
  11. };
  12.  
  13. class Graph {
  14. int n;
  15. list<Node>* adjList;
  16. private:
  17. void showList(int src, list<Node> lt) {
  18. Node tempNode;
  19.  
  20. for (list<Node>::iterator i = lt.begin(); i != lt.end(); i++) {
  21. tempNode = *i;
  22. cout << "(" << src << ")---(" << tempNode.dest << "|" << tempNode.cost << ") ";
  23. }
  24. cout << endl;
  25. }
  26. public:
  27. Graph() {
  28. n = 0;
  29. }
  30.  
  31. Graph(int nodeCount) {
  32. n = nodeCount;
  33. adjList = new list<Node>[n];
  34. }
  35.  
  36. void addEdge(int source, int dest, int cost) {
  37. Node newNode;
  38. newNode.dest = dest;
  39. newNode.cost = cost;
  40. adjList[source].push_back(newNode);
  41. }
  42.  
  43. void displayEdges() {
  44. for (int i = 0; i < n; i++) {
  45. list<Node> tempList = adjList[i];
  46. showList(i, tempList);
  47. }
  48. }
  49. static int findDegree(Graph G, int ver)
  50. {
  51. return G.adjList[ver].size();
  52. }
  53.  
  54. friend void dijkstra(Graph g, int* dist, int* prev, int start);
  55. };
  56.  
  57. void dijkstra(Graph g, int* dist, int* prev, int start) {
  58. int n = g.n;
  59.  
  60. for (int u = 0; u < n; u++) {
  61. dist[u] = numeric_limits<int>::max();
  62. prev[u] = -1;
  63. }
  64.  
  65. dist[start] = 0;
  66. set<int> S;
  67. list<int> Q;
  68.  
  69. for (int u = 0; u < n; u++) {
  70. Q.push_back(u);
  71. }
  72.  
  73. while (!Q.empty()) {
  74. list<int> ::iterator i;
  75. i = min_element(Q.begin(), Q.end());
  76. int u = *i;
  77. Q.remove(u);
  78. S.insert(u);
  79.  
  80. for (list<Node>::iterator it = g.adjList[u].begin(); it != g.adjList[u].end(); it++) {
  81. if ((dist[u] + (it->cost)) < dist[it->dest]) {
  82. dist[it->dest] = (dist[u] + (it->cost));
  83. prev[it->dest] = u;
  84. }
  85. }
  86. }
  87. }
  88.  
  89. int main() {
  90. const int n = 7;
  91. Graph g(n);
  92. int dist[n], prev[n];
  93. int start = 0;
  94.  
  95. g.addEdge(0, 1, 3);
  96. g.addEdge(0, 2, 6);
  97. g.addEdge(1, 0, 3);
  98. g.addEdge(1, 2, 2);
  99. g.addEdge(1, 3, 1);
  100. g.addEdge(2, 1, 6);
  101. g.addEdge(2, 1, 2);
  102. g.addEdge(2, 3, 1);
  103. g.addEdge(2, 4, 4);
  104.  
  105. g.addEdge(2, 5, 2);
  106. g.addEdge(3, 1, 1);
  107. g.addEdge(3, 2, 1);
  108. g.addEdge(3, 4, 2);
  109. g.addEdge(3, 6, 4);
  110. g.addEdge(4, 2, 4);
  111. g.addEdge(4, 3, 2);
  112. g.addEdge(4, 5, 2);
  113. g.addEdge(4, 6, 1);
  114. g.addEdge(5, 2, 2);
  115. g.addEdge(5, 4, 2);
  116. g.addEdge(5, 6, 1);
  117. g.addEdge(6, 3, 4);
  118. g.addEdge(6, 4, 1);
  119. g.addEdge(6, 5, 1);
  120.  
  121. dijkstra(g, dist, prev, start);
  122.  
  123. for (int i = 0; i < n; i++)
  124. if (i != start)
  125. cout << start << " to " << i << ", Cost: " << dist[i] << " Previous: " << prev[i] << endl;
  126. cout << "VER: " << Graph::findDegree(g, 2);
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement