Advertisement
Arrias

Untitled

Jul 13th, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.19 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. #define Node pair<int, pair<int,int>>
  4. using namespace std;
  5.  
  6. int const N = 4e3 + 5;
  7. int const INF = 1e18;
  8.  
  9. vector <pair<int,double>> g[N]; // вершина - длина
  10. vector <pair<int, double>> graph[N]; // перестроенный входной граф
  11. int len[N][N];
  12. int start;
  13. int n;
  14.  
  15. void dfs(int u, int sum, int p = -1) {
  16. len[start][u] = sum;
  17. for (auto i : g[u]) {
  18. if (i.first != p) {
  19. dfs(i.first, sum + i.second, u);
  20. }
  21. }
  22. }
  23.  
  24. int reu(int i) {
  25. if (i > n) return (i - n);
  26. else return (i);
  27. }
  28.  
  29. pair <double, vector<int>> dij(double x) {
  30. vector <double> d(2 * n + 1, INF); d[x] = 0;
  31. vector <int> way(2 * n + 1, -1);
  32. set <pair<double, int>> que;
  33. que.insert(make_pair(0, x));
  34. while (que.size()) {
  35. auto top = *que.begin();
  36. int from = top.second;
  37. int len = top.first;
  38. que.erase(top);
  39. if (d[from] != top.first) continue;
  40.  
  41. for (auto v : graph[from]) {
  42. if (d[v.first] > d[from] + v.second) {
  43. d[v.first] = d[from] + v.second;
  44. way[v.first] = from;
  45. que.insert(make_pair(d[v.first], v.first));
  46. }
  47. }
  48. }
  49.  
  50. vector <int> result;
  51.  
  52. for (int i = n + 1; i != 1; i = way[i]) {
  53. if (i == -1) break;
  54. if (result.size() == 0 || reu(i) != reu(result.back())) result.push_back(reu(i));
  55. if (i == -1) break;
  56. }
  57.  
  58. return make_pair(d[n + 1], result);
  59. }
  60.  
  61. signed main() {
  62. cin >> n;
  63.  
  64. vector <pair<double,double>> v; // first - подгтовка, second - скорость
  65. v.push_back(make_pair(INF, INF));
  66.  
  67. for (int i = 1; i <= n; ++i) {
  68. int a, b;
  69. cin >> a >> b;
  70. v.push_back(make_pair(a, b));
  71. }
  72.  
  73. for (int i = 0; i < n - 1; ++i) {
  74. double a, b, len;
  75. cin >> a >> b >> len;
  76. g[(int)a].push_back(make_pair(b, len));
  77. g[(int)b].push_back(make_pair(a, len));
  78. }
  79.  
  80. for (int i = 1; i <= n; ++i) {
  81. start = i;
  82. dfs(i, 0);
  83. }
  84.  
  85. for (int i = 1; i <= n; ++i) {
  86. graph[n + i].push_back(make_pair(i, v[i].first));
  87. }
  88.  
  89.  
  90. for (int i = 1; i <= n; ++i) {
  91. for (int j = n + 1; j <= 2 * n; ++j) {
  92. if (j != n + i) {
  93. graph[i].push_back(make_pair(j, len[i][j - n] / v[i].second));
  94. }
  95. }
  96. }
  97.  
  98. double ans = -INF;
  99. vector <int> out;
  100.  
  101. for (int i = n + 1; i <= 2 * n; ++i) {
  102. auto res = dij(i);
  103. if (res.first > ans) {
  104. ans = res.first;
  105. out = res.second;
  106. }
  107. }
  108.  
  109. cout <<fixed << setprecision(10) << ans << '\n';
  110. reverse(out.begin(), out.end());
  111.  
  112. for (int i = 0; i < out.size(); ++i) {
  113. cout << out[i];
  114. if (i != out.size() - 1) cout << ' ';
  115. }
  116.  
  117. cout << '\n';
  118.  
  119. return 0;
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement