Advertisement
Guest User

Untitled

a guest
Jul 16th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.75 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. #include <algorithm>
  5. #include <string>
  6. #include <fstream>
  7. #include <chrono>
  8. std::ifstream infile("TestInput.txt");
  9. using namespace std;
  10.  
  11. const int N = 1e5;
  12. double dis[N + 1];
  13. int col[N + 1];
  14. int previ[N + 1];
  15. bool vis[N + 1] = { 0 };
  16. vector<pair<int, double>> adj[N+1];
  17.  
  18. class cmp {
  19. public:
  20. bool operator() (const pair<int, double> &p1, const pair<int, double> &p2) {
  21. return p1.second > p2.second;
  22. }
  23. };
  24.  
  25. void dijkstra(int m) {
  26. for (int i = 0; i < m; i++) {
  27. dis[i] = INT_MAX;
  28. col[i] = INT_MAX;
  29. previ[i] = -1;
  30. vis[i] = false;
  31. }
  32. dis[1] = 0;
  33. priority_queue<pair<int, double>, vector<pair<int, double> >, cmp> q;
  34. q.push(make_pair(1, 0));
  35. while (!q.empty()) {
  36. pair<int, double> currPair = q.top();
  37. q.pop();
  38. int currVertex = currPair.first;
  39. double currWeight = currPair.second;
  40.  
  41. if (vis[currVertex]) {
  42. continue;
  43. }
  44. if (currVertex == m-1) {
  45. break;
  46. }
  47.  
  48. vis[currVertex] = true;
  49. for (int i = 0; i < adj[currVertex].size(); i++) {
  50. int nextVertex = adj[currVertex][i].first;
  51. int nextEdgeCol = adj[currVertex][i].second;
  52. int currEdgeCol = col[nextVertex];
  53.  
  54. if (!vis[nextVertex]) {
  55. pair<int, int> newP;
  56. if (currWeight + 1 < dis[nextVertex]) {
  57. previ[nextVertex] = currVertex;
  58. dis[nextVertex] = currWeight + 1;
  59. col[nextVertex] = nextEdgeCol;
  60. newP = make_pair(nextVertex, dis[nextVertex]);
  61. } else if (currWeight + 1 == dis[nextVertex]) {
  62. if (col[nextVertex] > nextEdgeCol) {
  63. previ[nextVertex] = currVertex;
  64. dis[nextVertex] = currVertex + 1;
  65. col[nextVertex] = nextEdgeCol;
  66. newP = make_pair(nextVertex, dis[nextVertex]);
  67. }
  68. }
  69. q.push(newP);
  70. }
  71. }
  72. }
  73. }
  74.  
  75. int main() {
  76. int n, m, v1, v2;
  77. double w;
  78. while (infile >> n >> m) {
  79. int k = 0;
  80. for (int i = 0; i < m; i++) {
  81. infile >> v1 >> v2 >> w;
  82. //TODO Only add smallest edge between 2 vertices
  83. adj[v1].push_back(make_pair(v2, w));
  84. adj[v2].push_back(make_pair(v1, w));
  85. }
  86. auto t1 = chrono::high_resolution_clock::now();
  87. dijkstra(n+1);
  88. auto t2 = chrono::high_resolution_clock::now();
  89. cout << "took "
  90. << chrono::duration_cast<chrono::milliseconds>(t2 - t1).count()
  91. << " millisecs "
  92. << "\n";
  93. string outs;
  94. while (n != 1) {
  95. outs.insert(0, to_string(col[n]) + " ");
  96. n = previ[n];
  97. k++;
  98. }
  99. outs = outs.substr(0, outs.length()-1);
  100. cout << k << "\n";
  101. cout << outs << "\n";
  102. t1 = chrono::high_resolution_clock::now();
  103. for (auto& v : adj) {
  104. v.clear();
  105. }
  106. t2 = chrono::high_resolution_clock::now();
  107. cout << "Clearing adj took "
  108. << chrono::duration_cast<chrono::milliseconds>(t2 - t1).count()
  109. << " millisecs "
  110. << "\n";
  111. }
  112. return 0;
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement