当前位置: 首页 > news >正文

河南省住房和城乡建设厅网站wordpress如何置顶

河南省住房和城乡建设厅网站,wordpress如何置顶,亚马逊书店购书官网,如何在百度里建网站文章目录树上倍增法#xff1a; LCA问题树上倍增法#xff1a; LCA问题 树上倍增法用于求解LCA问题是一种非常有效的方法。 倍增是什么#xff1f; 简单来说#xff0c;倍增就是 1 2 4 8 16 … 2^k 可以发现倍增是呈 2的指数型递增的一类数据#xff0c;和二分一样 LCA问题树上倍增法 LCA问题 树上倍增法用于求解LCA问题是一种非常有效的方法。 倍增是什么 简单来说倍增就是 1 2 4 8 16 … 2^k 可以发现倍增是呈 2的指数型递增的一类数据和二分一样二分是缩小范围的而倍增是扩大的因此倍增与二分都具有 logn的时间复杂度对于求解某些问题是非常高效的。 什么是树的公共祖先 如图所示 节点 7与 节点8的最近公共祖先是 节点6节点3 与 节点5的最近公共祖先是节点1 类似这种问题我们可以使用 树上倍增法来实现 树上倍增的实现 首先定义 fa[i] [j] 表示 节点编号为 i 的节点向根节点方向走了 2^j 步所到达的节点 什么是走了 2^j 步 走一条边规定为走了一步j可以表示为 0 12 分别代表走了 1步2步4步 走了一步 到达了节点6 走了两步 到达了节点5 走了四步超过了范围因此只能到达 节点1 因此我们的 fa数组实际上记录的就是 节点 i 的 第 2^j 个祖先分别为1节点62节点54节点1 因此首先把整个树结构存储起来使用链式前向星 然后首先对整个图进行预处理 预处理的目标 就是把每个 节点的 第 2^j 个的祖先找出来用于之后的处理同时我们还需要记录每个节点的深度我们采用递归的形式每次递归节点的深度都是父节点的深度1 注意lg数组预处理每个节点的当前深度1可以使得某些地方得到优化 void init(int now,int father) {fa[now][0]father;//第now节点的第2^0个父亲节点即第一个父亲节点是fatherdepth[now]depth[father]1;//now的深度是父亲节点深度1//for (int i1;ilg[depth[now]];i)for (int i1;(1i)depth[now];i){fa[now][i]fa[fa[now][i-1]][i-1];//初始化fa数组}//递归预处理当前点的所有子节点for (int ihead[now];i;iedge[i].next){if (edge[i].to!father){init(edge[i].to,now);}} }寻找LCA的过程 我们会发现几个问题 两个节点的深度不一样该如何寻找呢什么时候寻找结束呢 即什么时候才能找到他们的LCA 呢 首先来看第一个问题 深度不同怎么解决 x和y节点 我们可以假设 x 节点的深度是最大的。每次让x节点往上移动直到x节点与y节点到达同一深度 什么时候结束寻找 即找到了最近公共祖先 当他们位于同一深度的时候让他们两个节点一起出发一起往上移动直到不能再往上移动了为止他们到达了一个相同的位置这个节点就是最近公共祖先的节点返回它即可。 int LCA(int x,int y) {if (depth[x]depth[y]) swap(x,y);//假设x的深度大于等于y的深度while (depth[x]depth[y])//让x与y到达同一深度倍增x的深度{xfa[x][lg[depth[x]-depth[y]]-1];}if (xy) return x;//当他们相同时LCA就是他们for (int klg[depth[x]]-1;k0;k--)//枚举每次移动的步数x与y同时倍增直到xy到达同一位置{if (fa[x][k]!fa[y][k]){xfa[x][k];yfa[y][k];}}return fa[x][0];//xy到达同一位置返回父节点 }模板例题 最近公共祖先 完整AC code //TODO: Write code here int n,m,s; const int N1e610; int nums[N]; struct Edge {int to,w,next; }edge[N]; int head[N],cnt; int fa[N][50],depth[N],lg[N]; void add_edge(int u,int v) {edge[cnt].nexthead[u];edge[cnt].tov;head[u]cnt; } void init(int now,int father) {fa[now][0]father;//第now节点的第2^0个父亲节点即第一个父亲节点是fatherdepth[now]depth[father]1;//now的深度是父亲节点深度1for (int i1;ilg[depth[now]];i){fa[now][i]fa[fa[now][i-1]][i-1];//初始化fa数组}//递归预处理当前点的所有子节点for (int ihead[now];i;iedge[i].next){if (edge[i].to!father){init(edge[i].to,now);}} } int LCA(int x,int y) {if (depth[x]depth[y]) swap(x,y);//假设x的深度大于等于y的深度while (depth[x]depth[y])//让x与y到达同一深度倍增x的深度{xfa[x][lg[depth[x]-depth[y]]-1];}if (xy) return x;//当他们相同时LCA就是他们for (int klg[depth[x]]-1;k0;k--)//枚举每次移动的步数x与y同时倍增直到xy到达同一位置{if (fa[x][k]!fa[y][k]){xfa[x][k];yfa[y][k];}}return fa[x][0];//xy到达同一位置返回父节点 } signed main() {cinnms;for (int i1;in-1;i){int u,v;scanf(%lld%lld,u,v);add_edge(u,v);add_edge(v,u);}for (int i1;in;i){lg[i]lg[i-1](1lg[i-1]i);}init(s,0);for (int i1;im;i){int u,v;scanf(%lld%lld,u,v);printf(%lld\n,LCA(u,v));} #define one 1return 0; }lg[i-1]i); } init(s,0); for (int i1;im;i) { int u,v; scanf(“%lld%lld”,u,v); printf(“%lld\n”,LCA(u,v)); } #define one 1 return 0; } 参考[树上倍增法](https://blog.csdn.net/chengqiuming/article/details/126694822)
http://www.hkea.cn/news/14306469/

相关文章:

  • 江门专业网站建设公司山东关键词优化推广
  • 淄博建站哪家好门户网站开发一般多少钱
  • 设计配色的网站网站排名怎么做 site
  • 哪个网站做超链接什么网站可以做国外生意
  • 网站关键词标题怎么写山东省建设工程电子信息网站
  • 2015年做哪些网站致富dz转wordpress
  • spark怎么做网站数据库如何建设网站兴田德润怎么样
  • 长沙推广型网站建设dw网页设计制作网站的成品
  • ps做网站边框郑州做旅游网站的公司
  • 博客网站需要的功能注册公司网页
  • 公司做网站设计的深圳交易服务中心官网
  • 免费域名模板建站网站建设设计
  • 网站的seo如何设计学校网站信息化建设工作心得
  • 网站建设相关的网站成品网站软件
  • 宜春网站建设公司微信开放平台怎么解除绑定
  • 工作室网站域名装饰工程包括哪些项目
  • 网站运营方案模板wordpress盈利博客
  • 高级营销型网站建设开发公司绩效考核评分细则
  • codeigniter 手机网站开发国土资源网站建设方案
  • 建立网站多少钱百度关键词搜索次数
  • 张家港安监站网址黑帽seo优化软件
  • 网站建设移动网络公司4001688688人工服务
  • 行情软件app网站大全下载常州网站建设公司哪个好
  • 机构编制网站建设广西建设网注册中心
  • 建设工程职称论文查询网站章丘区当地网站建设哪家好
  • 批量爆破wordpress后台密码seo排名优化排行
  • seo站长工具查询系统广州网站设计公司vi设计公司
  • 网站建设伍金手指下拉9卡盟平台官网
  • 免费图标下载网站凡客诚品官方商城
  • 无锡新区网站建设中国城乡建设经济研究所 网站