Advertisement
oaktree

dijkstra.cpp

May 14th, 2016
502
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.01 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <algorithm>
  5. #include <limits>
  6. void debug(const std::string& s) {
  7.     std::cout << s << std::endl;
  8. }
  9. int dijkstra(std::vector< std::vector<int> >& matrix, int start, int end) {
  10.  
  11.     start--; end--;
  12.  
  13.     std::vector<int> distances(matrix.size()), previous(matrix.size());
  14.     std::vector<int> nodes, path;
  15.  
  16.     for (int i = 0, n = matrix[start].size(); i < n; i++) {
  17.  
  18.         if (i == start)
  19.             distances[i] = 0;
  20.         else
  21.             distances[i] = std::numeric_limits<int>::max();
  22.  
  23.         nodes.push_back(i);
  24.     }
  25.    
  26.     auto comp = [&](int l, int r) {return distances[l] > distances[r];};
  27.     std::sort(nodes.begin(), nodes.end(), comp);
  28.    
  29.     while(!nodes.empty()) {
  30.         int smallest = nodes.back();
  31.         nodes.pop_back();
  32.  
  33.         if (smallest == end) {
  34.  
  35.             while(smallest != start) {
  36.  
  37.                 path.push_back(smallest+1);
  38.                 smallest = previous[smallest];
  39.             }
  40.            
  41.             path.push_back(start+1);
  42.             std::reverse(path.begin(), path.end());
  43.             break;
  44.         }
  45.  
  46.         if (distances[smallest] == std::numeric_limits<int>::max())
  47.             break;
  48.  
  49.         for(int i = 0, n = matrix[smallest].size(); i < n; i++) {
  50.             int tmp = distances[smallest] + matrix[smallest][i];
  51.            
  52.             if (tmp < 0)
  53.                 tmp = std::numeric_limits<int>::max();
  54.                 // combat integer overflow!
  55.            
  56.             if (tmp < distances[i]) {
  57.                 distances[i] = tmp;
  58.                 previous[i] = smallest;
  59.  
  60.                 std::sort(nodes.begin(), nodes.end(), comp);
  61.             }
  62.         }
  63.     }
  64.  
  65.     for(auto& v : path) std::cout << v << " ";
  66.     std::cout << "\n";
  67.  
  68.     return distances[end];
  69. }
  70.  
  71. int main() {
  72.     std::cout << "How many nodes? ";
  73.     int nodes; std::cin >> nodes;
  74.  
  75.     std::vector < std::vector<int> > matrix(nodes, std::vector<int>(nodes));
  76.  
  77.     for (auto& v : matrix) {
  78.         for (auto& d : v) {
  79.             std::cin >> d;
  80.  
  81.             if (d < 0)
  82.                 d = std::numeric_limits<int>::max();
  83.         }
  84.     }
  85.  
  86.     std::cout << "Start point? ";
  87.     int start; std::cin >> start;
  88.  
  89.     std::cout << "End point? ";
  90.     int end; std::cin >> end;
  91.  
  92.     std::cout << "Distance: " << dijkstra(matrix, start, end) << std::endl;
  93.  
  94.     return 0;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement