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

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

LCA思想:http://www.cnblogs.com/hujunzheng/p/3945885.html在求解最近公共祖先为问题上,用到的是Tarjan的思想,从根结点开始形成一棵深搜树,非常好的处理技巧就是在回溯到结点u的时候,u的子树已经遍历,这时候才把u结点放入合并集合中,这样u结点和所有u的子树中的结点的最近公共祖先就是u了,u和还未遍历的所有u的兄弟结点及子树中的最近公共祖先就是u的父亲结点。以此类推。。这样我们在对树深度遍历的时候就很自然的将树中的结点分成若干的集合,两个集合中的所属不同集合的任意一对顶点的公共祖先都是相同的,也就是说这两个集合的最近公共最先只有一个。对于每个集合而言可以用并查集来优化,时间复杂度就大大降低了,为O(n + q),n为总结点数,q为询问结点对数。

/*    题意很明显,就是求LCA!*/#include
#include
#include
#include
#include
#define N 10005using namespace std;int n;int x, y;vector
g[N];int f[N];int vis[N], cnt[N];int ret;int getFather(int x){ return x==f[x] ? x : f[x]=getFather(f[x]);}bool LCA(int u){ vis[u]=1; f[u]=u; int len=g[u].size(); if(u==x && vis[y]){ ret=getFather(y); return true; } else if(u==y && vis[x]){ ret=getFather(x); return true; } for(int i=0; i
#include
#include
#include
#include
#include
#define N 905#define M 25000using namespace std;vector
g[N];vector
p[M];int cnt[N];int f[N];int vis[N];int ans[N];int n, m;int getFather(int x){ return x==f[x] ? x : f[x]=getFather(f[x]);}void LCA(int u){ f[u]=u; vis[u]=1; int len; len=p[u].size(); for(int i=0; i
你可能感兴趣的文章
UITableView占位图的低耦合性设计
查看>>
一个女装小程序的瀑布流实现
查看>>
Docker实现Mariadb分库分表、读写分离
查看>>
Node.js核心内容
查看>>
github克隆本地项目
查看>>
j抽奖
查看>>
GMQ力争为全球区块链数字资产技术应用贡献一份力量
查看>>
VUE+Vant 实现图片上传
查看>>
ajax实现点击加载更多
查看>>
为什么JavaScript没有类而使用原型?——JavaScript语言特性来历
查看>>
TarsGo新版本发布,支持protobuf,zipkin和自定义插件
查看>>
Flutter 如何创建并发布 Plugin (VS Code + GitHub 发布)
查看>>
TableStore实战:GEO索引打造亿量级店铺搜索系统
查看>>
js的防抖和节流
查看>>
redis学与思系列(2)
查看>>
学习springBoot(11)shiro安全框架
查看>>
c++那些事儿11 0 STL List
查看>>
问题记录——跨域
查看>>
PHP7.3即将到来,快来了解一下新特性吧
查看>>
1月9日云栖精选夜读:场景化封装,一站式使用,普惠AI集成 ——阿里云发布智能媒体管理产品...
查看>>