fork download
  1. #include <bits/stdc++.h>
  2. #define fi first
  3. #define se second
  4. #define all(v) v.begin() , v.end()
  5. #define sz(v) int(v.size())
  6. #define unq(v) sort(all(v)); v.resize(unique(all(v)) - v.begin());
  7. using namespace std;
  8.  
  9. typedef long long ll;
  10. typedef pair<int , int> ii;
  11. typedef pair<long long , int> lli;
  12.  
  13. const int maxN = int(3e5)+7;
  14.  
  15. struct node{
  16. int n , sz[maxN];
  17. ll dp[maxN] , cost = 0;
  18. int ver = -1;
  19. vector<int> g[maxN];
  20. vector<ii> E;
  21.  
  22. void init(int _n){
  23. n = _n;
  24. cost = 0;
  25. ver = -1;
  26. for (int i = 1 ; i <= n ; i++){
  27. g[i].clear();
  28. dp[i] = 0;
  29. }
  30. E.clear();
  31. }
  32.  
  33. void add_edge(int u , int v){
  34. g[u].push_back(v);
  35. g[v].push_back(u);
  36. E.push_back({u , v});
  37. }
  38.  
  39. void dfs_init(int u , int par){
  40. sz[u] = 1;
  41. dp[u] = 0;
  42. for (int v : g[u]){
  43. if (v != par){
  44. dfs_init(v , u);
  45. sz[u] += sz[v];
  46. dp[u] += dp[v] + 1ll * sz[v];
  47. }
  48. }
  49. }
  50.  
  51. void change(int u , int v){
  52. sz[u] -= sz[v];
  53. dp[u] -= dp[v] + 1ll * sz[v];
  54. sz[v] += sz[u];
  55. dp[v] += dp[u] + 1ll * sz[u];
  56. }
  57.  
  58. void dfs_reroot(int u , int par){
  59. cost += dp[u];
  60. if (ver == -1 || dp[ver] < dp[u]) ver = u;
  61. for (int v : g[u]){
  62. if (v != par){
  63. change(u , v);
  64. dfs_reroot(v , u);
  65. change(v , u);
  66. }
  67. }
  68. }
  69. } f[3];
  70.  
  71. node add(node X , node Y){
  72. int n = X.n + Y.n;
  73. node ans; ans.init(n);
  74. for (auto it : X.E){
  75. ans.add_edge(it.fi , it.se);
  76. }
  77. for (auto it : Y.E){
  78. ans.add_edge(it.fi + X.n , it.se + X.n);
  79. }
  80. ans.add_edge(X.ver , Y.ver + X.n);
  81. ans.dfs_init(1 , 0);
  82. ans.dfs_reroot(1 , 0);
  83. return ans;
  84. }
  85.  
  86. void solve(){
  87. for (int i = 0 ; i < 3 ; i++){
  88. int n; cin >> n;
  89. f[i].init(n);
  90. for (int j = 1 ; j < n ; j++){
  91. int u , v;
  92. cin >> u >> v;
  93. f[i].add_edge(u , v);
  94. }
  95. f[i].dfs_init(1 , 0);
  96. f[i].dfs_reroot(1 , 0);
  97. }
  98. node A = add(add(f[0] , f[1]) , f[2]);
  99. node B = add(add(f[1] , f[2]) , f[0]);
  100. node C = add(add(f[2] , f[0]) , f[1]);
  101. cout << max(A.cost , max(B.cost , C.cost)) / 2 << "\n";
  102. }
  103.  
  104. #define name "A"
  105.  
  106. int main(){
  107. ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  108. if (fopen(name".INP" , "r")){
  109. freopen(name".INP" , "r" , stdin);
  110. freopen(name".OUT" , "w" , stdout);
  111. }
  112. int t = 1; cin >> t;
  113. solve();
  114. return 0;
  115. }
  116.  
  117.  
  118.  
Success #stdin #stdout 0.05s 104904KB
stdin
Standard input is empty
stdout
1