最近公共祖先详解_共同祖先

最近公共祖先详解_共同祖先最近公共祖先带查询的节点为x和y节点,书的深度为d暴力求解:设置访问数组vis[N],以此遍历x的父节点并做标记,然后再遍历y的父节点,第一个被做标记的就是公共祖先,时间复杂度为O(d)倍增法:f[i][j]代表当前节点向上走2j2^j2j所能走到的节点,其中0≤j≤⌈log(d)⌉0\leq j \leq \lceil log(d) \rceil0≤j≤⌈log(d)⌉,时间复杂度为O(logn),另外还需要设置dist[N]代表节点i到根的距离+1,哨兵:如果从i开始跳2j2^j2j步会跳过根节

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

最近公共祖先

带查询的节点为x和y节点,书的深度为d

  1. 暴力求解:设置访问数组vis[N],以此遍历x的父节点并做标记,然后再遍历y的父节点,第一个被做标记的就是公共祖先,时间复杂度为O(d)
  2. 倍增法:f[i][j]代表当前节点向上走 2 j 2^j 2j所能走到的节点,其中 0 ≤ j ≤ ⌈ l o g ( d ) ⌉ 0\leq j \leq \lceil log(d) \rceil 0jlog(d),时间复杂度为O(logn),另外还需要设置dist[N]代表节点i到根的距离+1,哨兵:如果从i开始跳 2 j 2^j 2j步会跳过根节点,那么f[i][j] = 0,dist[root]=0
  3. Tarjan离线算法:将每一个搜索过的点归类到他的代表节点中去,代表节点就是搜索过的节点与当前节点的公共祖先。时间复杂度O(n)

倍增法

  1. 先将两个点跳到同一层
  2. 再让两个点往上跳,一直跳到他们的公共祖先的下一个几点。我们跳的时候是基于二进制拼凑的思想,从最高位到最低位判断

预处理f[i][j]时间复杂度:nlog(n)
查询O(logn)

倍增法(bfs)代码

int fa[N][16],depth[N];
int q[N],hh = 0,tt = 0;
int head[N],cnt;
struct Edge{ 

int v,next;
}edge[M];
void add(int u,int v){ 

edge[cnt].v = v;
edge[cnt].next = head[u];
head[u] = cnt ++;
}
void bfs(int root){ 
     //预处理
memset(depth,INF,sizeof depth);
q[0] = root;
depth[0] = 0;
depth[root] = 1,fa[root][0] = 0;
while(hh <= tt){ 

int t = q[hh ++];
for(int i = head[t];~i;i = edge[i].next){ 

int ver = edge[i].v;
if(depth[ver] < depth[t] + 1)continue;
depth[ver] = depth[t] + 1;
q[++ tt] = ver;
fa[ver][0] = t;
for(int k = 1;k < 16;k ++){ 

fa[ver][k] = fa[fa[ver][k - 1]][k - 1];
}
}
}
}
int lca(int a,int b){ 

if(depth[a] < depth[b])swap(a,b);
for(int k = 15;k >= 0;k --)
if(depth[fa[a][k]] >= depth[b])
a = fa[a][k];
if(a == b)return a;
for(int k = 15;k >= 0;k --)
if(fa[a][k] != fa[b][k]){ 

a = fa[a][k];
b = fa[b][k];
}
return fa[a][0];
}

Tarjan

struct Edge{ 

int v,next;
}edge[M];
void add(int u,int v){ 

edge[cnt].v = v;
edge[cnt].next = head[u];
head[u] = cnt ++;
}
void init(){ 

for(int i = 0;i < N;i ++)fa[i] = i;
}
int Find(int x){ 

return fa[x] = (fa[x] == x ? x : Find(fa[x]));
}
void Tarjan(int u,int f){ 

vis[u] = true;
for(auto &q : query[u]){ 

int y = q.x,id = q.y;
if(vis[y])res[id] = Find(y);    //如果之前遍历过另一个节点
}
for(int i = head[u];~i;i = edge[i].next){ 

int ver = edge[i].v;
if(ver == f)continue;
Tarjan(ver,u);
fa[ver] = u;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/168771.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • C#中HttpWebRequest的用法详解

    C#中HttpWebRequest的用法详解HttpWebRequest和HttpWebResponse类是用于发送和接收HTTP数据的最好选择。它们支持一系列有用的属性。这两个类位于System.Net命名空间,默认情况下这个类对于控制台程序来说是可访问的。请注意,HttpWebRequest对象不是利用new关键字通过构造函数来创建的,而是利用工厂机制(factorymechanism)通过Create()方法来创建的。另外,你可…

  • 【分享】GEARS of DRAGOON 1+2【日文硬盘版】[带全CG存档&amp;攻略+SSG改动+打开存档补丁]…

    【分享】GEARS of DRAGOON 1+2【日文硬盘版】[带全CG存档&amp;攻略+SSG改动+打开存档补丁]…冒险者们哟。寻找龙秘玉吧——!ninetail的最新作,是使用丰富多彩的技能·道具探索迷宫的3D迷宫RPG!存在着骑士和神官的架空世界常见的职业为首的13种职业。超过数百种的道具的登场!和伙伴一起探索迷宫,强化入手的装备。以及打败新的强敌,以得到稀有道具为目标!同一时候。本作的故事依据与哪一个组织接触而分为“Low线”与“Chaos线”两种类。Low线为王道的冒…

  • 安卓编程用什么软件_如何用手机进行编程?有哪些值得推荐的软件?

    安卓编程用什么软件_如何用手机进行编程?有哪些值得推荐的软件?手机上可以编程的软件其实有很多,有付费的也有免费的,这里简单介绍几个免费的手机编程软件,主要分为C/C++、Java、Python、Html和Linux5个方面,感兴趣的朋友可以自己下载尝试一下,主要内容如下:C/C++这里介绍一个手机软件—C++编译器,可以直接编辑运行C/C++代码,代码高亮,自带有语法检查功能,使用起来非常不错,下面我简单介绍一下这个软件:1.首先,安装C++编译器,这个直接…

  • win10开始键没反应解决方法「建议收藏」

    win10开始键没反应解决方法「建议收藏」win10开始键没反应解决方法具体方法如下:1、打开运行窗口。windows7系统:通过“开始”菜单进入。点击“开始”菜单,从打开的菜单中依次点击“所有程序”>“附件”>“运行”来打开“运行”窗口。windows10系统:右击屏幕左下角win标志,在弹出的菜单中找到“运行”,点击进入运行窗口2、在搜索窗口输入“regedit”,打开注册表编辑器。3、在在注册表“HKEY_CLASSES_ROOT”主键下找到“lnkfile”字符串值项。打开它。4、在右侧右击它,会出现一个菜单

  • vue使用富文本编辑器tynimce并实现图片上传_富文本编辑器有什么用

    vue使用富文本编辑器tynimce并实现图片上传_富文本编辑器有什么用vue-富文本编辑器Vue-Quill-Editor使用官网文档,可以参照文档进行使用https://www.kancloud.cn/liuwave/quill/1434140简单的使用:首先安装依赖:npminstallvue-quill-editor–save然后可以在全局挂载或者在单页面挂载单页面挂载示例:importVuefrom’vue’importVueQuillEditorfrom’vue-quill-editor’//requirestyles

    2022年10月14日
  • gridview DataFormatString[通俗易懂]

    转有个时间要在gridview中显示,但是保持着数据库中的是标准时间,很长,而且只需要显示日期,就想要格式化字符串,可是设置了DataFormatString就是不起作用,后来一查,原来要设置”行为”中HtmlEncode=falseDataFormatString=”{0:格式字符串}”在DataFormatString中的{0}表示数据本身,而在冒号后面的格式字符串代表所们希望…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号