Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <algorithm>
- class node {
- public:
- std::vector<int> tr;
- int distance, height = 0;
- int long_path, short_path = -1;
- ~node() {
- //вроде ничего не надо очищать
- }
- };
- class tree {
- private:
- std::vector<node> tree_node;
- public:
- tree(int n) {
- tree_node.resize(n);
- }
- ~tree() {
- //вроде ничего не надо очищать
- }
- void add_edge(int, int);
- void height(int);
- void make_dist(int, int);
- void max_height(int);
- void printer();
- };
- void tree::max_height(int cur) {
- if (tree_node[cur].tr.empty())
- return;
- int max_height = 0;
- tree_node[cur].long_path = -1;
- for (int i = 0; i != tree_node[cur].tr.size(); i++) {
- int h = tree_node[tree_node[cur].tr[i]].height + 1;
- if (max_height < h) {
- tree_node[cur].short_path = tree_node[cur].long_path;
- max_height = h;
- tree_node[cur].long_path = i;
- }
- else if (tree_node[cur].short_path == -1 || tree_node[tree_node[cur].tr[tree_node[cur].short_path]].height + 1 < h) {
- tree_node[cur].short_path = i;
- }
- }
- tree_node[cur].height = max_height;
- }
- void tree::add_edge(int dep, int des) {
- if (dep > des)
- std::swap(dep, des);
- tree_node[dep].tr.push_back(des);
- }
- void tree::height(int cur) {
- for (int i = 0; i < tree_node[cur].tr.size(); i++) {
- height(tree_node[cur].tr[i]);
- }
- max_height(cur);
- }
- void tree::make_dist(int cur, int add_dist) {
- if (add_dist > tree_node[cur].height) {
- tree_node[cur].distance = add_dist;
- }
- else {
- tree_node[cur].distance = tree_node[cur].height;
- }
- for (int i = 0; i < tree_node[cur].tr.size(); i++) {
- if (i == tree_node[cur].long_path) {
- if (tree_node[cur].short_path != -1) {
- if (add_dist + 1 > tree_node[tree_node[cur].tr[tree_node[cur].short_path]].height + 2) {
- make_dist(tree_node[cur].tr[i], add_dist + 1);
- }
- else {
- make_dist(tree_node[cur].tr[i], tree_node[tree_node[cur].tr[tree_node[cur].short_path]].height + 2);
- }
- }
- else
- {
- make_dist(tree_node[cur].tr[i], add_dist + 1);
- }
- }
- else {
- 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));
- }
- }
- }
- void tree::printer() {
- for (int i = 0; i < tree_node.size(); i++) {
- std::cout << tree_node[i].distance << std::endl;
- }
- }
- int main() {
- int n;
- std::cin >> n;
- tree tree(n);
- for (int i = 0; i < n - 1; ++i) {
- int dep = 0;
- int des = 0;
- std::cin >> dep;
- std::cin >> des;
- tree.add_edge(dep, des);
- }
- tree.height(0);
- tree.make_dist(0, 0);
- tree.printer();
- system("pause");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement