记录编号 325729 评测结果 AAAAAAAAAA
题目名称 不平凡的许愿树 最终得分 100
用户昵称 Gravatarsxysxy 是否通过 通过
代码语言 C++ 运行时间 2.207 s
提交时间 2016-10-20 10:53:11 内存使用 0.38 MiB
显示代码纯文本
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cstdlib>
  4. #include <cstdarg>
  5. #include <string>
  6. #include <list>
  7. #include <algorithm>
  8. #include <queue>
  9. #include <vector>
  10. using namespace std;
  11. #define MAXN 5002
  12. vector<int> G[MAXN];
  13. int deep[MAXN];
  14. int parent[MAXN];
  15. int cnt[MAXN];
  16. int first[MAXN];
  17. /*
  18. void dfs(int u)
  19. {
  20. for(int i = 0; i < G[u].size(); i++)
  21. {
  22. int to = G[u][i];
  23. if(to != parent[u])
  24. {
  25. parent[to] = u;
  26. deep[to] = deep[u]+1;
  27. dfs(to);
  28. }
  29. }
  30. }
  31. */
  32. int tmp1[MAXN], tmp2[MAXN];
  33. int dfs(int u, int d)
  34. {
  35. cnt[d]++;
  36. int maxd = 1;
  37. for(int i = 0; i < G[u].size(); i++)
  38. {
  39. int to = G[u][i];
  40. if(to != parent[u])
  41. {
  42. parent[to] = u;
  43. maxd = max(maxd, dfs(to, d+1)+1);
  44. }
  45. }
  46. return maxd;
  47. }
  48. int main()
  49. {
  50. freopen("hopetree.in", "r", stdin);
  51. freopen("hopetree.out", "w", stdout);
  52. int n;
  53. scanf("%d", &n);
  54. for(int i = 1; i < n; i++)
  55. {
  56. int a, b;
  57. scanf("%d %d", &a, &b);
  58. G[a].push_back(b);
  59. G[b].push_back(a);
  60. }
  61. long long ans = 0;
  62. for(int i = 1; i <= n; i++)
  63. {
  64. for(int j = 0; j < G[i].size(); j++)
  65. {
  66. parent[G[i][j]] = i;
  67. int maxd = dfs(G[i][j], 1);
  68. for(int k = 1; k <= maxd; k++)
  69. {
  70. ans += tmp2[k]*cnt[k];
  71. tmp2[k] += tmp1[k]*cnt[k];
  72. tmp1[k] += cnt[k];
  73. cnt[k] = 0;
  74. }
  75. }
  76. for(int j = 1; j <= n; j++)
  77. tmp1[j] = tmp2[j] = 0;
  78. /*
  79. parent[i] = 0;
  80. memset(deep, 0, sizeof(deep));
  81. deep[i] = 1;
  82. dfs(i);
  83. sort(deep+1, deep+1+n);
  84. int maxd = 1;
  85. memset(cnt, 0, sizeof(cnt));
  86. for(int i = 1; i <= n; i++)
  87. {
  88. cnt[deep[i]]++;
  89. maxd = max(maxd, deep[i]);
  90. }
  91. for(int i = 1; i <= maxd; i++)
  92. {
  93. ans += cnt[i]*tmp2[i];
  94. tmp2[i] += tmp1[i]*cnt[i];
  95. tmp1[i] += cnt[i];
  96. }
  97. memset(tmp1, 0, sizeof(tmp1));
  98. memset(tmp2, 0, sizeof(tmp2));
  99. */
  100. }
  101. printf("%lld %lld", ans%338+1, (ans+233)%338+1);
  102. return 0;
  103. }