Advertisement
Guest User

Untitled

a guest
Nov 28th, 2015
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.93 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #define _USE_MATH_DEFINES
  3. #include <iostream>
  4. #include <fstream>
  5. #include <cmath>
  6. #include <string>
  7. #include <string.h>
  8. #include <map>
  9. #include <set>
  10. #include <vector>
  11. #include <algorithm>
  12. #include <functional>
  13. #include <list>
  14. #include <queue>
  15. using namespace std;
  16.  
  17. typedef long double ld;
  18. typedef long int i64;
  19. typedef unsigned long int u64;
  20.  
  21. const ld EPS = 1e-16;
  22.  
  23. #define sqr(a) ((a)*(a)//;
  24.  
  25. int n, k, slot = -1, leaf, mbans, poppush, m;
  26. vector <vector <int> > a;
  27. vector <int> dist, b, dafter[2];
  28. queue <int> q;
  29. vector <pair <int, int> > ans;
  30.  
  31. void dfs(int v, int ind)
  32. {
  33. for (int i = 0; i < a[v].size(); ++i)
  34. {
  35. if (a[v][i] != mbans)
  36. {
  37. dfs(a[v][i], ind);
  38. dafter[ind][v] = max(dafter[ind][v], dafter[ind][a[v][i]] + 1);
  39. }
  40. }
  41. }
  42.  
  43.  
  44. int main()
  45. {
  46. cout.precision(24);
  47. freopen("input.txt", "r", stdin);
  48. freopen("output.txt", "w", stdout);
  49.  
  50. cin >> n >> k;
  51. a.resize(n+5);
  52. b.resize(n+5);
  53. dist.resize(n+5);
  54. dafter[0].resize(n+5);
  55. dafter[1].resize(n+5);
  56.  
  57. for (int i = 0; i < n; ++i)
  58. {
  59. cin >> b[i + 1];
  60. a[b[i + 1]].push_back(i + 1);
  61. }
  62.  
  63.  
  64. q.push(0);
  65.  
  66. while (q.size())
  67. {
  68. if (a[q.front()].size() < k && slot == -1)
  69. slot = q.front();
  70.  
  71. for (int i = 0; i < a[q.front()].size(); ++i)
  72. {
  73. dist[a[q.front()][i]] = dist[q.front()] + 1;
  74. q.push(a[q.front()][i]);
  75. }
  76.  
  77. if (dist[q.front()] > dist[leaf])
  78. leaf = q.front();
  79. q.pop();
  80. }
  81.  
  82. dfs(0, 0);
  83. int diff = dist[leaf] - dist[slot];
  84. ans.resize(diff);
  85. mbans = leaf;
  86.  
  87.  
  88. for (int i = 0; i < diff; ++i)
  89. {
  90. for (int j = 0; j < dafter[1].size(); ++j)
  91. dafter[1][j] = 0;
  92. dfs(0, 1);
  93. dfs(mbans, 1);
  94. ans[i].first = max(dafter[1][0], dist[slot] + dafter[1][mbans] + 1);
  95. ans[i].second = mbans;
  96. mbans = b[mbans];
  97. }
  98.  
  99.  
  100. for (int i = 0; i < ans.size(); ++i)
  101. if (ans[m].first > ans[i].first)
  102. m = i;
  103.  
  104. cout << ans[m].second << ' ' << slot;
  105.  
  106. return 0;
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement