记录编号 458593 评测结果 AAAAAAAAAA
题目名称 [USACO Oct08] 牧场旅行 最终得分 100
用户昵称 GravatarLovelove_boii 是否通过 通过
代码语言 C++ 运行时间 0.032 s
提交时间 2017-10-11 16:36:33 内存使用 5.11 MiB
显示代码纯文本
  1. #include<fstream>
  2. using namespace std;
  3. ifstream cin("pwalk.in");
  4. ofstream cout("pwalk.out");
  5. struct node
  6. {
  7. int father,value;
  8. }tree[1001];
  9. int n,q;
  10. int union_find[1001];
  11. int ask[1001][2];
  12. bool que[1001][1001];
  13. int ans[1001][1001];
  14. int root;
  15. bool vis[1001];
  16. int Find(int x)
  17. {
  18. if(x==union_find[x])
  19. {
  20. return x;
  21. }
  22. return Find(union_find[x]);
  23. }
  24. void Union(int tar,int get)
  25. {
  26. union_find[get]=Find(tar);
  27. }
  28. int get_ans(int s,int t,int lca)
  29. {
  30. int ret=0;
  31. while(s!=lca)
  32. {
  33. ret+=tree[s].value;
  34. s=tree[s].father;
  35. }
  36. while(t!=lca)
  37. {
  38. ret+=tree[t].value;
  39. t=tree[t].father;
  40. }
  41. return ret;
  42. }
  43. void tarjan(int r)
  44. {
  45. for(int i=1;i<=n;i++)
  46. {
  47. if(tree[i].father==r)
  48. {
  49. tarjan(i);
  50. Union(r,i);
  51. vis[i]=true;
  52. }
  53. }
  54. for(int i=1;i<=1000;i++)
  55. {
  56. if(que[r][i])
  57. {
  58. if(vis[i])
  59. {
  60. int lca=Find(i);
  61. ans[r][i]=ans[i][r]=get_ans(r,i,lca);
  62. }
  63. }
  64. }
  65. return;
  66. }
  67. int main()
  68. {
  69. cin>>n>>q;
  70. for(int i=1;i<n;i++)
  71. {
  72. union_find[i]=i;
  73. int u,v,val;
  74. cin>>u>>v>>val;
  75. tree[u].father=v;
  76. tree[u].value=val;
  77. }
  78. union_find[n]=n;
  79. for(int i=1;i<=n;i++)
  80. {
  81. if(!tree[i].father)
  82. {
  83. root=i;
  84. }
  85. }
  86. for(int i=1;i<=q;i++)
  87. {
  88. int p1,p2;
  89. cin>>p1>>p2;
  90. ask[i][0]=p1;
  91. ask[i][1]=p2;
  92. que[p1][p2]=que[p2][p1]=true;
  93. }
  94. tarjan(root);
  95. for(int i=1;i<=q;i++)
  96. {
  97. cout<<ans[ask[i][0]][ask[i][1]]<<endl;
  98. }
  99. cin.close();
  100. cout.close();
  101. return 0;
  102. }