Advertisement
Guest User

4_1

a guest
Dec 9th, 2019
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.72 KB | None | 0 0
  1.  
  2. #include <iostream>
  3. #include <vector>
  4. #include <algorithm>
  5.  
  6.  
  7.  
  8. class node {
  9. public:
  10.  
  11. std::vector<int> tr;
  12. int distance, height = 0;
  13. int long_path, short_path = -1;
  14.  
  15.  
  16.  
  17. ~node() {
  18. //вроде ничего не надо очищать
  19. }
  20. };
  21.  
  22.  
  23. class tree {
  24. private:
  25. std::vector<node> tree_node;
  26.  
  27.  
  28. public:
  29. tree(int n) {
  30. tree_node.resize(n);
  31. }
  32. ~tree() {
  33. //вроде ничего не надо очищать
  34. }
  35.  
  36. void add_edge(int, int);
  37. void height(int);
  38. void make_dist(int, int);
  39. void max_height(int);
  40. void printer();
  41.  
  42. };
  43.  
  44. void tree::max_height(int cur) {
  45.  
  46. if (tree_node[cur].tr.empty())
  47. return;
  48.  
  49. int max_height = 0;
  50. tree_node[cur].long_path = -1;
  51.  
  52. for (int i = 0; i != tree_node[cur].tr.size(); i++) {
  53.  
  54. int h = tree_node[tree_node[cur].tr[i]].height + 1;
  55.  
  56. if (max_height < h) {
  57. tree_node[cur].short_path = tree_node[cur].long_path;
  58. max_height = h;
  59. tree_node[cur].long_path = i;
  60. }
  61.  
  62. else if (tree_node[cur].short_path == -1 || tree_node[tree_node[cur].tr[tree_node[cur].short_path]].height + 1 < h) {
  63. tree_node[cur].short_path = i;
  64. }
  65. }
  66.  
  67. tree_node[cur].height = max_height;
  68. }
  69.  
  70. void tree::add_edge(int dep, int des) {
  71. if (dep > des)
  72. std::swap(dep, des);
  73. tree_node[dep].tr.push_back(des);
  74. }
  75.  
  76.  
  77. void tree::height(int cur) {
  78.  
  79. for (int i = 0; i < tree_node[cur].tr.size(); i++) {
  80. height(tree_node[cur].tr[i]);
  81. }
  82. max_height(cur);
  83. }
  84.  
  85.  
  86. void tree::make_dist(int cur, int add_dist) {
  87.  
  88. if (add_dist > tree_node[cur].height) {
  89. tree_node[cur].distance = add_dist;
  90. }
  91. else {
  92. tree_node[cur].distance = tree_node[cur].height;
  93. }
  94.  
  95.  
  96. for (int i = 0; i < tree_node[cur].tr.size(); i++) {
  97.  
  98. if (i == tree_node[cur].long_path) {
  99.  
  100. if (tree_node[cur].short_path != -1) {
  101.  
  102. if (add_dist + 1 > tree_node[tree_node[cur].tr[tree_node[cur].short_path]].height + 2) {
  103. make_dist(tree_node[cur].tr[i], add_dist + 1);
  104. }
  105. else {
  106. make_dist(tree_node[cur].tr[i], tree_node[tree_node[cur].tr[tree_node[cur].short_path]].height + 2);
  107. }
  108.  
  109. }
  110.  
  111. else
  112. {
  113. make_dist(tree_node[cur].tr[i], add_dist + 1);
  114. }
  115. }
  116.  
  117. else {
  118. make_dist(tree_node[cur].tr[i], std::max(add_dist + 1, tree_node[tree_node[cur].tr[tree_node[cur].long_path]].height + 2));
  119. }
  120.  
  121.  
  122. }
  123. }
  124.  
  125.  
  126. void tree::printer() {
  127.  
  128. for (int i = 0; i < tree_node.size(); i++) {
  129. std::cout << tree_node[i].distance << std::endl;
  130. }
  131. }
  132.  
  133.  
  134.  
  135. int main() {
  136.  
  137. int n;
  138. std::cin >> n;
  139.  
  140. tree tree(n);
  141.  
  142. for (int i = 0; i < n - 1; ++i) {
  143.  
  144. int dep = 0;
  145. int des = 0;
  146. std::cin >> dep;
  147. std::cin >> des;
  148.  
  149. tree.add_edge(dep, des);
  150. }
  151.  
  152. tree.height(0);
  153. tree.make_dist(0, 0);
  154. tree.printer();
  155.  
  156. system("pause");
  157. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement