Advertisement
Guest User

Untitled

a guest
Apr 1st, 2020
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.90 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. class Edge
  8. {
  9. public:
  10. int a;
  11. int b;
  12. long long weight;
  13. Edge(int x, int y, long long value)
  14. {
  15. a = x;
  16. b = y;
  17. weight = value;
  18. }
  19. };
  20.  
  21. vector< pair<long long, bool> > distances;
  22. vector<int> *buff;
  23. vector<Edge> edges;
  24. int n, m, s;
  25. ifstream InputFile("path.in");
  26. ofstream OutputFile("path.out");
  27.  
  28. vector<int> cycle(vector<Edge> e, int n, int m) {
  29. vector<long long> d (n);
  30. vector<int> p (n, -1);
  31. int x;
  32. for (int i = 0; i < n; ++i) {
  33. x = -1;
  34. for (int j = 0; j < m; ++j)
  35. if (d[e[j].b] > d[e[j].a] + e[j].weight) {
  36. d[e[j].b] = max (-LONG_LONG_MAX, d[e[j].a] + e[j].weight);
  37. p[e[j].b] = e[j].a;
  38. x = e[j].b;
  39. }
  40. }
  41.  
  42. vector<int> path;
  43. if (x == -1)
  44. return path;
  45. else {
  46. int y = x;
  47. for (int i=0; i<n; ++i)
  48. y = p[y];
  49.  
  50.  
  51. for (int cur=y; ; cur=p[cur]) {
  52. path.push_back (cur);
  53. if (cur == y && path.size() > 1) break;
  54. }
  55. return path;
  56. }
  57. }
  58.  
  59. void dfs(int p)
  60. {
  61. distances[p].second = false;
  62. for (int i = 0; i < buff[p].size(); i++)
  63. {
  64. if (distances[buff[p][i]].second) {
  65. dfs(buff[p][i]);
  66. }
  67. }
  68. }
  69.  
  70. void solve()
  71. {
  72. for (int i = 0; i < distances.size(); i++)
  73. {
  74. for (int j = 0; j < edges.size(); j++)
  75. {
  76. if (distances[edges[j].a].first < LONG_LONG_MAX)
  77. {
  78. if (distances[edges[j].b].first > distances[edges[j].a].first + edges[j].weight)
  79. {
  80. if (distances[edges[j].a].first + edges[j].weight > 0 || (distances[edges[j].a].first < 0 || edges[j].weight < 0))
  81. distances[edges[j].b].first = distances[edges[j].a].first + edges[j].weight;
  82. }
  83. }
  84. }
  85. }
  86. vector<int> cycled = cycle(edges, n, m);
  87. if (!cycled.empty())
  88. dfs(cycled[0]);
  89. distances[s].second = true;
  90. for (int i = 0; i < distances.size(); i++)
  91. {
  92. if (!distances[i].second)
  93. OutputFile << "-\n";
  94. else if (distances[i].first == LONG_LONG_MAX)
  95. OutputFile << "*\n";
  96. else
  97. OutputFile << distances[i].first << "\n";
  98.  
  99. }
  100. }
  101.  
  102. int main()
  103. {
  104. int firstNode, secondNode;
  105. long long distance;
  106. InputFile >> n >> m >> s;
  107. s--;
  108. buff = new vector<int>[n];
  109. distances.resize(n, make_pair(LONG_LONG_MAX, true));
  110. distances[s].first = 0;
  111. for (int i = 0; i < m; i++)
  112. {
  113. InputFile >> firstNode >> secondNode >> distance;
  114. firstNode--;
  115. secondNode--;
  116. buff[firstNode].push_back(secondNode);
  117. edges.emplace_back(firstNode, secondNode, distance);
  118. }
  119. solve();
  120. return 0;
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement