Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2014
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.68 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define mp make_pair
  6. #define pb push_back
  7. #define sz(a) (int)(a).size()
  8. #define fori(i,b,e) for(int i = (b); i < (e); i++)
  9. #define forn(i,n) fori(i,0,n)
  10. #define f first
  11. #define s second
  12.  
  13. typedef long long int64;
  14. typedef long long LL;
  15. typedef pair<int, int> pii;
  16. typedef vector<int> vi;
  17.  
  18. int getInt() { int x; scanf("%d", &x); return x;}
  19.  
  20. const int MAXN = 1e3 + 5;
  21.  
  22. vi g[MAXN];
  23. int lca[MAXN][MAXN];
  24. vi who[MAXN];
  25. bool alive[MAXN * MAXN];
  26. int par[MAXN];
  27. vector<pii> qs;
  28. int n, m;
  29. int depth[MAXN];
  30. int cnt[MAXN];
  31. bool deleted[MAXN];
  32.  
  33. int get_lca(int v, int u) {
  34. // printf("%d->%d %d->%d\n", v, par[v], u, par[u]);
  35.  
  36. if (lca[v][u] != -1) {
  37. return lca[v][u];
  38. }
  39.  
  40. if (depth[v] < depth[u]) {
  41. return lca[v][u] = get_lca(v, par[u]);
  42. }
  43.  
  44. if (depth[u] < depth[v]) {
  45. return lca[v][u] = get_lca(par[v], u);
  46. }
  47.  
  48. if (v == u) {
  49. return lca[v][u] = v;
  50. }
  51.  
  52. return lca[v][u] = get_lca(par[v], par[u]);
  53. }
  54.  
  55. void dfs(int v, int p = -1, int de = 0) {
  56. // printf("%d par = %d\n", v, p);
  57. depth[v] = de;
  58. par[v] = p;
  59.  
  60. for (int to : g[v]) {
  61. if (to != p) {
  62. dfs(to, v, de + 1);
  63. }
  64. }
  65. }
  66.  
  67. void dfs_delete(int v) {
  68. // printf("%d\n", v);
  69. if (deleted[v]) {
  70. return;
  71. }
  72.  
  73. for (int id : who[v]) {
  74. alive[id] = false;
  75. }
  76.  
  77. for (int to : g[v]) {
  78. if (to != par[v]) {
  79. dfs_delete(to);
  80. }
  81. }
  82. }
  83.  
  84. int main() {
  85. #ifdef DEBUG
  86. freopen("in.txt", "rt", stdin);
  87. // freopen("out.txt", "wt", stdout);
  88. #endif
  89.  
  90. int T;
  91. scanf("%d", &T);
  92. while (T --> 0) {
  93. scanf("%d", &n);
  94. forn(i, n - 1) {
  95. int v, u;
  96. scanf("%d%d", &v, &u);
  97. --v;
  98. --u;
  99.  
  100. g[v].pb(u);
  101. g[u].pb(v);
  102. }
  103.  
  104. memset (lca, -1, sizeof lca);
  105. dfs(0);
  106.  
  107. scanf("%d", &m);
  108. forn(i, m) {
  109. int v, u;
  110. scanf("%d%d", &v, &u);
  111. --v;
  112. --u;
  113.  
  114. qs.pb(mp(v, u));
  115. }
  116.  
  117. memset (cnt, 0, sizeof cnt);
  118. forn(i, sz(qs)) {
  119. // printf("%d\n", get_lca(qs[i].f, qs[i].s));
  120. ++cnt[n - depth[get_lca(qs[i].f, qs[i].s)]];
  121. }
  122.  
  123. for (int i = 1; i < n; ++i) {
  124. cnt[i] += cnt[i - 1];
  125. }
  126.  
  127. vector<pii> qs_(sz(qs));
  128. forn(i, sz(qs)) {
  129. qs_[--cnt[n - depth[get_lca(qs[i].f, qs[i].s)]]] = qs[i];
  130. }
  131. qs_.swap(qs);
  132.  
  133. forn(i, sz(qs)) {
  134. who[qs[i].f].pb(i);
  135. who[qs[i].s].pb(i);
  136. }
  137.  
  138. memset (alive, true, sizeof alive);
  139. memset (deleted, false, sizeof deleted);
  140. int ans = 0;
  141. forn(i, sz(qs)) {
  142. if (alive[i]) {
  143. int c = get_lca(qs[i].f, qs[i].s);
  144. dfs_delete(c);
  145. ++ans;
  146. }
  147. }
  148.  
  149. printf("%d\n", ans);
  150.  
  151. forn(i, n) {
  152. who[i].clear();
  153. g[i].clear();
  154. }
  155.  
  156. qs.clear();
  157. }
  158.  
  159. return 0;
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement