Advertisement
monyca98

Johnson version2

May 25th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.96 KB | None | 0 0
  1. //johnson
  2. #include<iostream>
  3. #include<fstream>
  4. #include<vector>
  5. #include<queue>
  6. #include<functional>
  7. #define INF 990
  8. using namespace std;
  9.  
  10. typedef pair<int, int> p;
  11. vector<vector<int>> g;
  12. vector<int> dist;
  13. int n, m;
  14. void read()
  15. {
  16. ifstream in("file.txt");
  17. if (!in.is_open())
  18. cout << "error";
  19. else
  20. {
  21. in >> n >> m;
  22. g.resize(n + 1);
  23. for (int i = 0; i <= n; i++)
  24. g[i].assign(n + 1, 0);
  25. int x, y, w;
  26. dist.assign(n + 1, INF);
  27. for (int i = 0; i < m; i++)
  28. {
  29. in >> x >> y >> w;
  30. g[x][y] = w;
  31. }
  32. }
  33. }
  34. void change_matrix()
  35. {
  36. g.resize(n + 1);
  37. for (int i = 0; i <= n; i++)
  38. {
  39. g[0][i] = 0;
  40. g[i][0] = 0;
  41. }
  42. }
  43. bool belman(int source)
  44. {
  45. dist.assign(n + 1 , INF);
  46. dist[source] = 0;
  47. for(int i=1;i<=n;i++)
  48. for(int j=1;j<=n;j++)
  49. for (int k = 1; k <= n; k++)
  50. if (dist[j] != INF)
  51. if(g[j][k]!=0 && dist[k]> dist[j]+g[j][k])
  52. dist[k] = dist[j] + g[j][k];
  53. //checking for negative cycles
  54. for (int i = 1; i <= n; i++)
  55. for (int j = 1; j <= n; j++)
  56. if (g[i][j] != 0 && dist[i] > dist[j] + g[i][j])
  57. return false;
  58. return true;
  59.  
  60. }
  61.  
  62. void dijkstra(int source)
  63. {
  64. priority_queue <int, vector<int>, greater<int>> q;
  65. dist[source] = 0;
  66. q.push(source );
  67. while (!q.empty())
  68. {
  69. int i = q.top();
  70. q.pop();
  71. for (int j = 1; j <= n; j++)
  72. {
  73. if (g[i][j] != 0 && dist[i] > dist[j] + g[i][j])
  74. {
  75. dist[i] = dist[j] + g[i][j];
  76. q.push(j );
  77. }
  78. }
  79. }
  80. }
  81. void johnson(int source)
  82. {
  83. change_matrix();
  84. if (belman(source))
  85. {
  86. for (int i = 1; i < n; i++)
  87. for (int j = 1; j < n; j++)
  88. g[i][j] += dist[i] - dist[j];
  89.  
  90. dist.assign(n + 1, INF);
  91. dist[source] = 0;
  92. dijkstra(source);
  93. }
  94. else
  95. cout << "contains negative cycles\n";
  96. }
  97. int main()
  98. {
  99. read();
  100. int source = 1;
  101. johnson(source);
  102. cout << "minimum distance between " << source << " and every node:\n";
  103. for (int i = 1; i < n; i++)
  104. cout << "node:" << i << " distance:" << dist[i] << endl;
  105. return 0;
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement