karbaev

Dijkstra AdL

Mar 28th, 2016
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.16 KB | None | 0 0
  1. /*
  2. //Sample Input
  3. 5 7
  4. 1 2 10
  5. 1 3 2
  6. 1 5 100
  7. 2 4 3
  8. 3 2 5
  9. 4 3 15
  10. 4 5 5
  11. */
  12.  
  13.  
  14. #include <fstream>
  15. #include <functional>
  16. #include <climits>
  17. #include <vector>
  18. #include <queue>
  19. #include <list>
  20.  
  21. using namespace std;
  22.  
  23. struct node {
  24.     int vertex;
  25.     int weight;
  26.     node(int v, int w) : vertex(v), weight(w) { };
  27.     node() { }
  28. };
  29.  
  30. class CompareGreater {
  31.     public:
  32.         bool const operator()(node &nodeX, node &nodeY) {
  33.             return (nodeX.weight > nodeY.weight) ;
  34.         }
  35. };
  36.  
  37. vector< list<node> > adj;
  38. vector<int> weights;
  39. priority_queue<node, vector<node>, CompareGreater> Q;
  40.  
  41. int nrVertices, nrEdges;
  42.  
  43. void readData();
  44. void Dijkstra(node);
  45. void writeData();
  46.  
  47. int main(int argc, char *argv[]) {
  48.  
  49.     readData();
  50.     Dijkstra(node(1, 0));
  51.     writeData();
  52.  
  53.     return 0;
  54. }
  55.  
  56. void readData() {
  57.     fstream in("dijkstra.in", ios::in);
  58.  
  59.     int nodeX, nodeY, weight;
  60.  
  61.     in >> nrVertices >> nrEdges;
  62.  
  63.     adj.resize(nrVertices+1);
  64.     weights.resize(1);
  65.  
  66.     for (int i = 1; i <= nrVertices; ++i) {
  67.         weights.push_back(INT_MAX);
  68.     }
  69.  
  70.     for (int i = 1; i <= nrEdges; ++i) {
  71.         in >> nodeX >> nodeY >> weight;
  72.         adj[nodeX].push_back(node(nodeY, weight));
  73.     }
  74.  
  75.     in.close();
  76. }
  77.  
  78. void Dijkstra(node startNode) {
  79.     node currentNode;
  80.  
  81.     weights[startNode.vertex] = 0;
  82.     Q.push(startNode);
  83.  
  84.     while (!Q.empty()) {
  85.         currentNode = Q.top();
  86.         Q.pop();
  87.  
  88.         if (currentNode.weight <= weights[currentNode.vertex]) {
  89.             for (list<node>::iterator it = adj[currentNode.vertex].begin(); it != adj[currentNode.vertex].end(); ++it) {
  90.                 if (weights[it->vertex] > weights[currentNode.vertex] + it->weight) {
  91.                     weights[it->vertex] = weights[currentNode.vertex] + it->weight;
  92.                     Q.push(node((it->vertex), weights[it->vertex]));
  93.                 }
  94.             }
  95.         }
  96.     }
  97. }
  98.  
  99. void writeData() {
  100.     fstream out("dijkstra.out", ios::out);
  101.  
  102.     weights.resize(nrVertices+1);
  103.     for (vector<int>::iterator it = weights.begin()+1; it != weights.end(); ++it) {
  104.         out << (*it) << " ";
  105.     }
  106.  
  107.     out.close();
  108. }
Advertisement
Add Comment
Please, Sign In to add comment