当前焦点!「学习笔记」tarjan求最近公共祖先
2023-04-30 08:30:07 来源:博客园
(资料图片仅供参考)
过程Tarjan 算法是一种 离线算法,需要使用并查集记录某个结点的祖先结点。并没有传说中的那么快。
将询问都记录下来,将它们建成正向边和反向边。在 dfs 的过程中,给走过的节点打上标记,同时维护并查集,这里利用了回溯的思想,如果 \(u\) 节点的这棵子树没搜完,那么 fa[u] = u;
,搜完后,在更新并查集。我们假设查询 \(u\) 和 \(v\) 的最近公共祖先,搜到节点 \(u\),如果另一个节点 \(v\) 已经被搜到过了,那么 \(v\) 点的并查集祖先就是 \(u\) 和 \(v\) 的最近公共祖先。
代码如果第一次查询 \(v\) 点时,发现 \(v\) 点已经被搜到了,说明 \(u\) 和 \(v\) 点在同一棵子树中,并且这个子树是所有包括了 \(u\) 点和 \(v\) 点的子树中
siz
最小的,这棵子树的根也是在所有符合条件的子树的根中离 \(u\) 和 \(v\) 最近的,即这棵子树的根就是 \(u\) 和 \(v\) 的最近公共祖先,而 \(v\) 的并查集祖先就是这个根节点。
结构体记录询问
int cnt = 1;struct query {int v, lca, nxt;} q[N << 1];
记录询问、初始化
for (int i = 1, x, y; i <= m; ++ i) {scanf("%d%d", &x, &y);add_query(x, y);add_query(y, x);}for (int i = 1; i <= n; ++ i) {fa[i] = i;}
tarjan、并查集
void tarjan(int u) {fa[u] = u;vis[u] = 1;for (int v : son[u]) {if (!vis[v]) {tarjan(v);fa[v] = u;}}int v;for (int i = h[u]; i; i = q[i].nxt) {if (vis[v = q[i].v]) {q[i].lca = q[i ^ 1].lca = find(v);}}}
fa[u] = u;
是为了保证在 \(u\) 这棵子树没有搜完的情况下,让它子树里的节点的并查集找祖先时找到的是它。
标签:
相关阅读
精彩推荐
- 当前焦点!「学习笔记」tarjan求最近公共祖先2023-04-30
- 能工巧匠“脱胎换骨”的成长路2023-04-30
- 铂爱如初,岁月流金|上财铂金合唱团招募令2023-04-30
- 新大陆(000997)2023年一季报财务简析:营2023-04-30
- 当前快看:*ST和佳(300273)2023年一季报2023-04-30
- 全球今亮点!新野纺织(002087)2023年一季2023-04-30
- 【全球新要闻】700亿龙头用友网络,曝上市22023-04-30
- “五一”假期首日多景区提前约满2023-04-30
- 焦点精选!现金巴士上征信有影响吗_现金巴2023-04-30
- F1阿塞拜疆站-冲刺赛排位赛乐扣夺“上墙”2023-04-30
- 新三国65集_新三国632023-04-30
- 【新要闻】亚马尔社媒:上演巴萨首秀是梦想2023-04-30
- 世界热消息:高级审计师考试《高级审计实务2023-04-30
- 一季度普惠金融领域贷款季度增量创新高 助2023-04-30
- 天天实时:duang是什么意思中文 duang是什2023-04-30
- 新资讯:中国的某个地下2400米深处,人类正2023-04-30
- 民生工作无小事每一件看似的事情都可能产生2023-04-30
- 世界今头条!状态火热!本泽马过去8场3次戴2023-04-30
- 维尼修斯被侵犯后找裁判理论染黄,拿到本赛2023-04-30
- 中秋节立体贺卡的制作方法图片_中秋节立体2023-04-30
- 全球最新:从太子不领兵的制度,来看看为何2023-04-30
- “五一”来了!揣上这份烧烤图鉴,大快朵颐2023-04-29
- 世界视点!北元集团:4月26日接受机构调研2023-04-29
- 中国儿童中心携手企业助力少年儿童健康成长2023-04-29
- 数字消费新愿景 经济发展新活力-当前快报2023-04-29
- 遇见福建:“五一”假期首日畅游数字“海洋2023-04-29
- 传统村落保护丨江西婺源:社会“认养”唤醒2023-04-29
- 一季度普惠金融领域贷款季度增量创新高 助2023-04-29
- 要闻:新华全媒+|“五一”假期来临 牢记这2023-04-29
- 特鲁姆普落后于巴里霍金斯后者在上半场打出2023-04-29