Advertisement
Guest User

Untitled

a guest
Mar 29th, 2020
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.51 KB | None | 0 0
  1. // Просто решаю.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
  2. //
  3.  
  4. //KiruxaLight
  5. #define _CRT_SECURE_NO_WARNINGS
  6. #define _USE_MATH_DEFINES
  7. #include <iostream>
  8. #include <vector>
  9. #include <string>
  10. #include <set>
  11. #include <map>
  12. #include <algorithm>
  13. #include <utility>
  14. #include <cmath>
  15. #include <iomanip>
  16. #include <stack>
  17. #include <deque>
  18. #include <queue>
  19. #include <cstdio>
  20. #include <unordered_map>
  21. #include <unordered_set>
  22. #include <numeric>
  23. #include <cassert>
  24. using namespace std;
  25. #define int long long
  26. #define all(a) a.begin(), a.end()
  27. #define rall(a) a.rbegin(), a.rend()
  28. const int INF = 1e9 + 123, MAXN = 2e5 + 47, MEGAINF = 1e18;
  29. template <class T>
  30. istream& operator >> (istream& in, vector <T>& a)
  31. {
  32.   for (auto& i : a)
  33.     in >> i;
  34.   return in;
  35. }
  36. template <class T>
  37. ostream& operator << (ostream& out, vector <T>& a)
  38. {
  39.   for (auto& i : a)
  40.     out << i << " ";
  41.   return out;
  42. }
  43. template <class T, class U>
  44. istream& operator >> (istream& in, vector <pair <T, U>>& a)
  45. {
  46.   for (auto& i : a)
  47.     in >> i.first >> i.second;
  48.   return in;
  49. }
  50. template <class T, class U>
  51. ostream& operator << (ostream& out, vector <pair <T, U>>& a)
  52. {
  53.   for (auto& i : a)
  54.     out << i.first << " " << i.second << endl;
  55.   return out;
  56. }
  57. int n;
  58. vector <vector <int>> g;
  59. vector <int> pr, tin, tout, h, used;
  60. int tik = 0;
  61. void dfs(int v, int p = -1, int high = 0)
  62. {
  63.   tin[v] = tik++;
  64.   pr[v] = p;
  65.   h[v] = high;
  66.   for (auto& i : g[v])
  67.     if (i != p)
  68.       dfs(i, v, high + 1);
  69.   tout[v] = tik++;
  70. }
  71. vector <int> dist, pr2;
  72. void dfs2(int v, int p = -1, int high = 0)
  73. {
  74.   dist[v] = high;
  75.   pr2[v] = p;
  76.   for (auto& i : g[v])
  77.     if (i != p)
  78.       dfs2(i, v, high + 1);
  79. }
  80. vector <vector <int>> up;
  81. void init()
  82. {
  83.   up.resize(20, vector <int>(n));
  84.   for (int i = 0; i < n; ++i)
  85.     up[0][i] = pr[i];
  86.   for (int i = 0; i < 19; ++i)
  87.     for (int j = 0; j < n; ++j)
  88.     {
  89.       int mid = up[i][j];
  90.       if (mid == -1)
  91.         up[i + 1][j] = -1;
  92.       else up[i + 1][j] = up[i][mid];
  93.     }
  94. }
  95. bool ancestor(int a, int b)
  96. {
  97.   return tin[a] <= tin[b] && tout[a] >= tout[b];
  98. }
  99. int lca(int a, int b)
  100. {
  101.   if (ancestor(a, b))
  102.     return a;
  103.   if (ancestor(b, a))
  104.     return b;
  105.   for (int i = 19; i >= 0; --i)
  106.     if (up[i][a] != -1 && !ancestor(up[i][a], b))
  107.       a = up[i][a];
  108.   return pr[a];
  109. }
  110. int len(int a, int b)
  111. {
  112.   return h[a] + h[b] - 2 * h[lca(a, b)];
  113. }
  114. vector <int> pos;
  115. void dfs3(int v, int p = -1)
  116. {
  117.   for (auto& i : g[v])
  118.     if (i != p)
  119.       dfs3(i, v);
  120.   if (!used[v]) //here you can delete leaves or add them to array and after that you can delete them
  121.     pos.push_back(v);
  122. }
  123. signed main()
  124. {
  125.   setlocale(LC_ALL, "rus");
  126.  
  127.   /*freopen(".in", "r", stdin);
  128.   freopen(".out", "w", stdout);*/
  129.  
  130.   ios_base::sync_with_stdio(false);
  131.   cin.tie(NULL);
  132.   cout.tie(NULL);
  133.  
  134.   cin >> n;
  135.   g.resize(n);
  136.   tin.resize(n);
  137.   tout.resize(n);
  138.   pr.resize(n);
  139.   h.resize(n);
  140.   dist.resize(n);
  141.   used.resize(n);
  142.   pr2.resize(n);
  143.   for (int i = 0; i < n - 1; ++i)
  144.   {
  145.     int u, v;
  146.     cin >> u >> v;
  147.     --u, --v;
  148.     g[u].push_back(v);
  149.     g[v].push_back(u);
  150.   }
  151.   dfs(0);
  152.   dfs2(0);
  153.   int start = max_element(all(dist)) - dist.begin();
  154.   dist.assign(n, 0);
  155.   pr2.assign(n, -1);
  156.   dfs2(start);
  157.   int fin = max_element(all(dist)) - dist.begin();
  158.   used[start] = 1;
  159.   for (int v = fin; v != start; v = pr2[v])
  160.     used[v] = 1;
  161.   vector <pair <pair <int, int>, int>> ans; //a, b, del
  162.   int res = 0;
  163.   dfs3(start);
  164.   init();
  165.   for (auto& i : pos)
  166.   {    
  167.     int length = len(i, start);
  168.     int length2 = len(i, fin);
  169.     if (length > length2)
  170.     {
  171.       ans.push_back({ {i + 1, start + 1}, i + 1 });
  172.       res += length;
  173.     }
  174.     else
  175.     {
  176.       ans.push_back({ {i + 1, fin + 1}, i + 1 });
  177.       res += length2;
  178.     }
  179.   }
  180.   int length = len(fin, start);
  181.   for (int v = fin; v != start; v = pr2[v])
  182.   {
  183.     res += length;
  184.     ans.push_back({ {v + 1, start + 1}, v + 1 });
  185.     --length;
  186.   }
  187.   cout << res << endl;
  188.   for (auto& [u, v] : ans)
  189.     cout << u.first << " " << u.second << " " << v << endl;
  190. }
  191. // Запуск программы: CTRL+F5 или меню "Отладка" > "Запуск без отладки"
  192. // Отладка программы: F5 или меню "Отладка" > "Запустить отладку"
  193.  
  194. // Советы по началу работы
  195. //   1. В окне обозревателя решений можно добавлять файлы и управлять ими.
  196. //   2. В окне Team Explorer можно подключиться к системе управления версиями.
  197. //   3. В окне "Выходные данные" можно просматривать выходные данные сборки и другие сообщения.
  198. //   4. В окне "Список ошибок" можно просматривать ошибки.
  199. //   5. Последовательно выберите пункты меню "Проект" > "Добавить новый элемент", чтобы создать файлы кода, или "Проект" > "Добавить существующий элемент", чтобы добавить в проект существующие файлы кода.
  200. //   6. Чтобы снова открыть этот проект позже, выберите пункты меню "Файл" > "Открыть" > "Проект" и выберите SLN-файл.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement