博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
oj1330Nearest Common Ancestors 1470 Closest Common Ancestors(LCA算法)
阅读量:6988 次
发布时间:2019-06-27

本文共 1729 字,大约阅读时间需要 5 分钟。

LCA思想:http://www.cnblogs.com/hujunzheng/p/3945885.html

在求解最近公共祖先为问题上,用到的是Tarjan的思想,从根结点开始形成一棵深搜树,非常好的处理技巧就是在回溯到结点u的时候,u的子树已经遍历,这时候才把u结点放入合并集合中,

这样u结点和所有u的子树中的结点的最近公共祖先就是u了,u和还未遍历的所有u的兄弟结点及子树中的最近公共祖先就是u的父亲结点。以此类推。。这样我们在对树深度遍历的时候就很自然的将树中的结点分成若干的集合,两个集合中的所属不同集合的任意一对顶点的公共祖先都是相同的,也就是说这两个集合的最近公共最先只有一个。对于每个集合而言可以用并查集来优化,时间复杂度就大大降低了,为O(n + q),n为总结点数,q为询问结点对数。

1 /* 2     题意很明显,就是求LCA! 3 */ 4 #include
5 #include
6 #include
7 #include
8 #include
9 #define N 1000510 using namespace std;11 12 int n;13 int x, y;14 vector
g[N];15 int f[N];16 int vis[N], cnt[N];17 int ret;18 19 int getFather(int x){20 return x==f[x] ? x : f[x]=getFather(f[x]);21 }22 23 bool LCA(int u){24 vis[u]=1;25 f[u]=u;26 int len=g[u].size();27 28 if(u==x && vis[y]){29 ret=getFather(y);30 return true;31 }32 33 else if(u==y && vis[x]){34 ret=getFather(x);35 return true;36 }37 38 for(int i=0; i
1 #include
2 #include
3 #include
4 #include
5 #include
6 #define N 905 7 #define M 25000 8 using namespace std; 9 10 vector
g[N];11 vector
p[M];12 int cnt[N];13 int f[N];14 int vis[N];15 int ans[N];16 17 int n, m;18 19 int getFather(int x){20 return x==f[x] ? x : f[x]=getFather(f[x]);21 }22 23 void LCA(int u){24 f[u]=u;25 vis[u]=1;26 int len;27 28 len=p[u].size();29 for(int i=0; i
本文转自 小眼儿 博客园博客,原文链接:http://www.cnblogs.com/hujunzheng/p/3945593.html,如需转载请自行联系原作者
你可能感兴趣的文章
别人要访问我的电脑上部署的tomcat,必须关闭防火墙吗?
查看>>
作业六
查看>>
c++ 二叉树打印节点路径
查看>>
ios--编码规范
查看>>
JsCV Core v0.2发布 & Javascript图像处理系列目录
查看>>
MVC中实现部分内容异步加载
查看>>
PTA编程总结2:
查看>>
剑指OFFER——顺时针打印矩阵
查看>>
Live Archive 3490 - Generator 概率
查看>>
Oracle SQL Developer
查看>>
Java 线程池框架核心代码分析
查看>>
「学习笔记——Linux」Linux软件管理(RPM,Dpkg,APT)
查看>>
Linux命令的那些事(二)
查看>>
强制转https
查看>>
Ubuntu下GTK的安装、编译和测试
查看>>
javascript中window.open()与window.location.href的区别
查看>>
Respond.js的作用
查看>>
FCN笔记(Fully Convolutional Networks for Semantic Segmentation)
查看>>
外部线程停止Java子线程的方法
查看>>
OpenMP并行编程
查看>>