Advertisement
Guest User

Untitled

a guest
Mar 17th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.99 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. const int N= 1e4+1;
  5. const int C= 1e2+1;
  6.  
  7. int f[N][C], n, m, c, hmax, h[N], Log[N], dp[N][20];
  8. vector<int> a[N], Color[C];
  9.  
  10. void DeepFirstSearch(int u, int high){
  11. h[u]= high;
  12. hmax= max(h[u], hmax);
  13. for (int i=0; i<a[u].size(); i++){
  14. int v= a[u][i];
  15. if (v== dp[u][0]) continue;
  16. dp[v][0]= u;
  17. DeepFirstSearch(v, high+1);
  18. }
  19. }
  20.  
  21. int make_ans(int u, int v){
  22. if (h[u]< h[v]) swap(u, v);
  23. int k= Log[h[u]], i1= u, i2= v;
  24. for (int i=k; i>=0; i--) if (h[u]-(1<<i)>= h[v]) u= dp[u][i];
  25. if (u==v) return h[i1]-h[i2];
  26. for (int i=k; i>=0; i--)
  27. if (dp[u][i]!= dp[v][i]&& dp[u][i]!=-1){
  28. u= dp[u][i];
  29. v= dp[v][i];
  30. }
  31. int ans= dp[u][0];
  32. return h[i1]+h[i2]-h[ans];
  33. }
  34.  
  35. int main(){
  36. scanf("%d", &n);
  37. for (int i=1; i<=n; i++) {
  38. int u, v;
  39. scanf("%d%d", &u, &v);
  40. a[u].push_back(v);
  41. a[v].push_back(u);
  42. }
  43. scanf("%d", &c);
  44. for (int i=1; i<=n; i++) {
  45. int Vertex;
  46. scanf("%d", &Vertex);
  47. Color[i].push_back(Vertex);
  48. }
  49.  
  50. DeepFirstSearch(1,0);
  51.  
  52. for (int i=2; i<=hmax; i++) Log[i]= Log[i/2]+1;
  53. int k= Log[hmax];
  54.  
  55. for (int j=1; j<=k; j++)
  56. for (int i=1; i<=n; i++) dp[i][j]= -1;
  57.  
  58. for (int j=1; j<=k; j++)
  59. for (int i=1; i<=n; i++)
  60. if (dp[i][j-1]!=-1) dp[i][j]= dp[dp[i][j-1]][j-1];
  61.  
  62. for (int i=1; i<=n; i++)
  63. for (int j=1; j<=c; j++) f[i][j]= 1e5+1;
  64.  
  65. for (int j=1; j<=c; j++)
  66. for (int i=1; i<=n; i++)
  67. for (int k=0; k<Color[j].size(); k++){
  68. int Vertex= Color[j][k];
  69. int ans= make_ans(Vertex, i);
  70. f[i][j]= min(f[i][j], ans);
  71. }
  72.  
  73. scanf("%d", &m);
  74. for (int i=1; i<=m; i++){
  75. int u, v;
  76. scanf("%d%d", &u, &v);
  77. printf("%d\n", f[u][v]);
  78. }
  79. return 0;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement