D.cpp 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #include <iostream>
  2. #include <vector>
  3. #include <cstring>
  4. using namespace std;
  5. const int maxn = 100010, maxh=40;
  6. struct node{
  7. int deep, home, father;
  8. };
  9. int home[maxh];
  10. node tree[maxn];
  11. int buildTree(int s){
  12. if(s==1||tree[s].deep!=0){
  13. return tree[s].deep;
  14. }
  15. return tree[s].deep = buildTree(tree[s].father)+1;
  16. }
  17. void find(int u, int v){
  18. home[tree[u].home]=1, home[tree[v].home]=1;
  19. if(tree[u].deep<tree[v].deep)
  20. swap(u, v);
  21. int differ = tree[u].deep-tree[v].deep;
  22. for(int i=1; i<=differ; i++){
  23. u = tree[u].father;
  24. home[tree[u].home]=1;
  25. }
  26. if(u==v)
  27. return;
  28. while(u!=v){
  29. u = tree[u].father;
  30. home[tree[u].home]=1;
  31. v = tree[v].father;
  32. home[tree[v].home]=1;
  33. }
  34. }
  35. int main(){
  36. int T, kase=1, n, m, q, u, v;
  37. cin>>T;
  38. while(kase<=T){
  39. memset(tree, 0, sizeof(tree));
  40. cout<<"Case "<<kase++<<":"<<endl;
  41. cin>>n>>m>>q;
  42. for(int i=1; i<=n; i++)
  43. cin>>tree[i].home;
  44. for(int i=1; i<n; i++){
  45. cin>>u>>v;
  46. tree[v].father=u;
  47. }
  48. for(int i=1; i<=n; i++)
  49. if(i!=1&&tree[i].deep==0)
  50. tree[i].deep=buildTree(tree[i].father)+1;
  51. for(int i=1; i<=q; i++){
  52. cin>>u>>v;
  53. find(u, v);
  54. for(int i=1; i<=m; i++)
  55. if(home[i])
  56. cout<<i<<" ";
  57. cout<<endl;
  58. memset(home, 0, sizeof(home));
  59. }
  60. }
  61. }