Advertisement
Guest User

Untitled

a guest
Feb 12th, 2016
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.45 KB | None | 0 0
  1. #include <iostream>
  2. #include <list>
  3. #include <queue>
  4. #include <fstream>
  5. #include <limits>
  6. #include <algorithm>
  7. #include <iomanip>
  8. using namespace std;
  9. struct node
  10. {
  11.     int to,
  12.         length;
  13.     node(int _to, int _length)
  14.     {
  15.         to = _to;
  16.         length = _length;
  17.     }
  18. };
  19. const int INF = INT_MAX;
  20. list <node>* graph;
  21. bool* visited;
  22. int* dist;
  23. queue <int> width;
  24.  
  25. void dij(int v, int n);
  26. void print(int n);
  27.  
  28. int main()
  29. {
  30.     const int INF = INT_MAX;
  31.     int n, v, w, l;
  32.     ifstream in("input.txt");
  33.     in >> n;
  34.     graph = new list<node>[n];
  35.     visited = new bool[n];
  36.     dist = new int[n];
  37.  
  38.     if (in.is_open())
  39.         while (!in.eof())
  40.         {
  41.             in >> v >> w >> l;
  42.             if (--v < n && --w < n)
  43.                 graph[v].push_back(node(w, l));
  44.         }
  45.     in.close();
  46.  
  47.     for (int i = 0; i < n; i++)
  48.     {
  49.         dist[i] = INF;
  50.         visited[i] = false;
  51.     }
  52.  
  53.     int startV;
  54.     cin >> startV;
  55.     dist[--startV] = 0;
  56.     dij(startV, n);
  57.     system("pause");
  58.     return 0;
  59. }
  60.  
  61. void dij(int v, int n)
  62. {
  63.     for each (node x in graph[v])
  64.     {
  65.         dist[x.to] = min(dist[x.to], dist[v] + x.length);
  66.         if (!visited[x.to])
  67.             width.push(x.to);
  68.     }
  69.     print(n);
  70.     visited[v] = true;
  71.     if (!width.empty())
  72.     {
  73.         int t = width.front();
  74.         width.pop();
  75.         dij(t, n);
  76.     }
  77. }
  78.  
  79. void print(int n)
  80. {
  81.     cout << setw(6) << "\nVertex" << setw(6) << "Dist" << endl;
  82.     for (int i = 0; i < n; i++)
  83.         if(dist[i] == INF)
  84.             cout << setw(6) << i + 1 << setw(6) << "INF" << endl;
  85.         else
  86.             cout << setw(6) << i + 1 << setw(6) << dist[i] << endl;
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement