记录编号 471668 评测结果 AAAAAAAAAA
题目名称 [USACO Feb04]距离咨询 最终得分 100
用户昵称 Gravatarcoolkid 是否通过 通过
代码语言 C++ 运行时间 0.104 s
提交时间 2017-11-06 18:29:44 内存使用 7.95 MiB
显示代码纯文本
  1. #include<iostream>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cstdio>
  5. using namespace std;
  6.  
  7. const int MAXN=40010;
  8. const int MAXLOG=20;
  9.  
  10. struct Edge{
  11. int from,to,dist,nxt;
  12. }edges[MAXN<<1];
  13. int head[MAXN],p=0;
  14.  
  15. void addedge(int f,int t,int d){
  16. edges[p].from=f;edges[p].to=t;edges[p].dist=d;edges[p].nxt=head[f];head[f]=p;p++;
  17. }
  18.  
  19. int n,m,q;
  20. int dep[MAXN],fa[MAXN][MAXLOG],faw[MAXN][MAXLOG];
  21.  
  22. void init(){
  23. memset(head,-1,sizeof(head));
  24. scanf("%d%d",&n,&m);
  25. for(int i=1;i<=m;i++){
  26. int f,t,d;char s[5];
  27. scanf("%d%d%d%s",&f,&t,&d,s);
  28. addedge(f,t,d);
  29. addedge(t,f,d);
  30. }
  31. }
  32.  
  33. void dfs(int u){
  34. for(int i=head[u];~i;i=edges[i].nxt){
  35. int v=edges[i].to,d=edges[i].dist;
  36. if(fa[u][0]==v) continue;
  37. fa[v][0]=u;faw[v][0]=d;dep[v]=dep[u]+1;
  38. dfs(v);
  39. }
  40. }
  41.  
  42. int mxlg=0;
  43.  
  44. void Mk(){
  45. for(int i=MAXLOG;i>=0;i--) if(n&(1<<i)){ mxlg=i;break; }
  46. mxlg++;
  47. for(int j=1;j<=mxlg;j++)
  48. for(int i=1;i<=n;i++) fa[i][j]=fa[fa[i][j-1]][j-1],faw[i][j]=faw[fa[i][j-1]][j-1]+faw[i][j-1];
  49. }
  50.  
  51. void Query(int u,int v){
  52. if(dep[v]>dep[u]) swap(u,v);
  53. int dlt=dep[u]-dep[v];
  54. int res=0;
  55. for(int i=mxlg;i>=0;i--) if(dlt&(1<<i)) res+=faw[u][i],u=fa[u][i];
  56. for(int i=mxlg;i>=0;i--){
  57. if(fa[u][i]!=fa[v][i]){
  58. res+=(faw[u][i]+faw[v][i]);
  59. u=fa[u][i];v=fa[v][i];
  60. }
  61. }
  62. if(u==v){
  63. printf("%d\n",res);
  64. return;
  65. }
  66. printf("%d\n",faw[v][0]+faw[u][0]+res);
  67. }
  68.  
  69. int main(){
  70. freopen("dquery.in","r",stdin);
  71. freopen("dquery.out","w",stdout);
  72. init();
  73. dfs(1);
  74. Mk();
  75. scanf("%d",&q);
  76. for(int i=1;i<=q;i++){
  77. int u,v;
  78. scanf("%d%d",&u,&v);
  79. Query(u,v);
  80. }
  81. return 0;
  82. }