z

你没有发现两个字里的blog都不一样嘛 qwq

题目描述-->p2912 牧场散步

题意概括

给定一个,给你Q个询问,每次询问输入一个二元组\((x,y)\),要求求出\((x,y)\)的距离.

明显带权lca.

这里写一下递推式

\[f[u][i]=f[f[u][i-1]][i-1]
\]

\[gw[u][i]=gw[f[u][i-1]][i-1]+gw[u][i-1]
\]

定义:

\(f[u][i]\)代表\(u\)向上跳\(2^i\)步到达的节点.

\(gw[u][i]\)代表\(u\)向上跳\(2^i\)步到达的节点的边权和.

为什么\(f[u][i]=f[f[u][i-1]][i-1]\)?

我们从\(u\)到达\(f[u][i]\)需要\(2^i\)步,而到达\(f[u][i-1]\)需要\(2^{i-1}\)步,再从这个位置跳\(2^{i-1}\)步,的话就到达了\(f[u][i]\)。

\[2^{i-1}+2^{i-1}=2*2^{i-1}=2^{i}
\]

又因为我们处理\(f[u][i-1]\)一定比处理\(f[u][i]\)要早,所以这样转移即可.

初始化

  1. f[u][0]=fa;
  2. gw[u][0]=edge[i].w;//即连向u的边权.

然后这样这个题就变成了裸的带权lca问题 qwq.

---------------------代码---------------------

  1. #include<bits/stdc++.h>
  2. #define R register
  3. #define N 1008
  4. using namespace std;
  5. inline void in(int &x)
  6. {
  7. int f=1;x=0;char s=getchar();
  8. while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
  9. while(isdigit(s)){x=x*10+s-'0';s=getchar();}
  10. x*=f;
  11. }
  12. int n,head[N],tot,m;
  13. int depth[N],f[N][18],gw[N][18];
  14. struct cod{int u,v,w;}edge[N<<1+8];
  15. inline void add(int x,int y,int z)
  16. {
  17. edge[++tot].u=head[x];
  18. edge[tot].v=y;
  19. edge[tot].w=z;
  20. head[x]=tot;
  21. }
  22. void dfs(int u,int fa,int dis)
  23. {
  24. depth[u]=depth[fa]+1;
  25. f[u][0]=fa;gw[u][0]=dis;
  26. for(R int i=1;(1<<i)<=depth[u];i++)
  27. f[u][i]=f[f[u][i-1]][i-1],
  28. gw[u][i]=gw[f[u][i-1]][i-1]+gw[u][i-1];
  29. for(R int i=head[u];i;i=edge[i].u)
  30. {
  31. if(edge[i].v==fa)continue;
  32. dfs(edge[i].v,u,edge[i].w);
  33. }
  34. }
  35. inline int lca(int x,int y)
  36. {
  37. if(depth[x]>depth[y])swap(x,y);
  38. int ans=0;
  39. for(R int i=17;i>=0;i--)
  40. if(depth[y]-(1<<i)>=depth[x])
  41. ans+=gw[y][i],y=f[y][i];
  42. if(x==y)return ans;
  43. for(R int i=17;i>=0;i--)
  44. {
  45. if(f[x][i]==f[y][i])continue;
  46. ans+=gw[x][i]+gw[y][i];
  47. y=f[y][i],x=f[x][i];
  48. }
  49. return (ans+gw[x][0]+gw[y][0]);
  50. }
  51. int main()
  52. {
  53. in(n),in(m);
  54. for(R int i=1,x,y,z;i<n;i++)
  55. {
  56. in(x),in(y),in(z);
  57. add(x,y,z);add(y,x,z);
  58. }
  59. dfs(1,0,0);
  60. for(R int x,y;m;m--)
  61. {
  62. in(x),in(y);
  63. printf("%d\n",lca(x,y));
  64. }
  65. }

LCA【p2912】 牧场散步 (USACO08OCT)的更多相关文章

  1. 洛谷P2912 牧场散步Pasture Walking

    题目描述 The \(N\) cows (\(2 \leq N \leq 1,000\)) conveniently numbered \(1..N\) are grazing among the N ...

  2. 【Luogu】P2912牧场散步(TarjanLCA)

    题目链接 老天……终于碰上一个除了模板之外的LCA题了 这道题用Tarjan来LCA.树上两个点的路径是唯一的,所以钦定一个根,两点间的路径就是两点到根的路径减去双倍的公共祖先到根的路径.大概很好理解 ...

  3. bzoj1602 / P2912 [USACO08OCT]牧场散步Pasture Walking(倍增lca)

    P2912 [USACO08OCT]牧场散步Pasture Walking 求树上两点间路径--->lca 使用倍增处理lca(树剖多长鸭) #include<iostream> # ...

  4. LCA || BZOJ 1602: [Usaco2008 Oct]牧场行走 || Luogu P2912 [USACO08OCT]牧场散步Pasture Walking

    题面:[USACO08OCT]牧场散步Pasture Walking 题解:LCA模版题 代码: #include<cstdio> #include<cstring> #inc ...

  5. 洛谷P2912 [USACO08OCT]牧场散步Pasture Walking [2017年7月计划 树上问题 01]

    P2912 [USACO08OCT]牧场散步Pasture Walking 题目描述 The N cows (2 <= N <= 1,000) conveniently numbered ...

  6. 洛谷——P2912 [USACO08OCT]牧场散步Pasture Walking(lca)

    题目描述 The N cows (2 <= N <= 1,000) conveniently numbered 1..N are grazing among the N pastures ...

  7. [USACO08OCT]牧场散步Pasture Walking BZOJ1602 LCA

    题目描述 The N cows (2 <= N <= 1,000) conveniently numbered 1..N are grazing among the N pastures ...

  8. luogu P2912 [USACO08OCT]牧场散步Pasture Walking

    题目描述 The N cows (2 <= N <= 1,000) conveniently numbered 1..N are grazing among the N pastures ...

  9. 洛谷 P2912 [USACO08OCT]牧场散步Pasture Walking

    题目描述 The N cows (2 <= N <= 1,000) conveniently numbered 1..N are grazing among the N pastures ...

随机推荐

  1. 详解zabbix2.2.2安装部署(Server端篇)

    今天开始安装zabbix.zabbix需要LNMP或者LAMP环境.环境的搭建不在本章范围内. LNMP环境配置 Linux安装:http://www.osyunwei.com/archives/10 ...

  2. APP测试用例要考虑的一些方面

    安装与卸载:●应用是否可以在IOS不同系统版本或android不同系统版本上安装(有的系统版本过低,应用不能适配)●软件安装后是否可以正常运行,安装后的文件夹及文件是否可以写到指定的目录里.●安装过程 ...

  3. c++知识点总结--友元&运算符重载

    友元函数(不属于类) 可以访问类的私有变量,以及私有函数 友元函数在类内声明需要friend关键字,类外定义就不需要 友元函数可以直接在类内定义 友元函数必须包含对象指针   友元类(不适用继承,只适 ...

  4. HDU 4760 Good Firewall ( Trie树 )

    一开始看的时候就想歪了,比赛的时候一直在YY线段树区间覆盖,然后纠结节点数太多开不下怎么办啊啊啊啊…… 然后昨天吃饭的时候也在纠结这到底是个啥题,后来发现公共前缀->前缀??!!!!->这 ...

  5. 前端构建工具gulpjs的使用介绍及技巧 (转)

    gulpjs是一个前端构建工具,与gruntjs相比,gulpjs无需写一大堆繁杂的配置参数,API也非常简单,学习起来很容易,而且gulpjs使用的是nodejs中stream来读取和操作数据,其速 ...

  6. let与const区别

    let 1. let有变量提升,但是有约束 2. 会形成暂时性死区(TDZ) 3. 同一个块级作用域内不允许声明相同变量 4. 块级变量 5. let声明的全局变量不是全局对象的属性,var会 6. ...

  7. poj1679 次最小生成树 kruskal(暴力枚举)

    Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definit ...

  8. 【飞天奔月出品】memcached四大注意事项(key长度,空格限制,最大item)

    1.   key值最大长度? memcached的key的最大长度是250个字符. 注意250是memcached服务器端内部的限制(可以修改) 如果您使用的客户端支持"key的前缀&quo ...

  9. Windows2008下RDP采用私有CA服务器证书搭建文档

    在中小型公司建立企业根证书颁发机构 (CA) http://www.microsoft.com/china/smb/issues/sgc/articles/build_ent_root_ca.mspx ...

  10. Java Web 路径问题

    可能在做文件上传或者 图片加载,资源加载 时候用到文件相对服务器地址 System.out.println(request.getRemoteUser()); //客户端用户System.out.pr ...