倍增法lca
2016-03-22 08:51
225 查看
intdep ,rt[25] ,siz ;//rt数组需要在dfs之前置-1。 voiddfs(intpos,intdeep){ dep[pos]=deep; siz[pos]=1; for(edge*it=adj[pos];it;it=it->next){ if(!dep[it->id]){ rt[0][it->id]=pos; dfs(it->id,deep+1); siz[pos]+=siz[it->id]; } } } voidprelca(){ for(inti=1;i<=20;i++){ for(intj=1;j<=n;j++){ rt[i][j]=rt[i-1][j]==-1?-1:rt[i-1][rt[i-1][j]]; } } } intLCA(intu,intv){//查询u和v的lca if(dep[u]<dep[v])swap(u,v); for(inti=0;i<21;i++){ if((dep[u]-dep[v])>>i&1){ u=rt[i][u]; } } if(u==v)returnu; for(inti=19;i>=0;i--){ if(rt[i][u]!=rt[i][v]){ u=rt[i][u]; v=rt[i][v]; } } returnrt[0][u]; } intjump(intpos,intnum){//查询节点pos的第num个父亲 for(inti=0;i<21;i++){ if(num>>i&1){ pos=rt[i][pos]; } } returnpos; }
相关文章推荐
- CLUSTER集群与存储技术
- Java中动态地改变数组长度及数组转Map的代码实例分享
- aodv之二
- CSS-float
- .NET面试题解析(07)-多线程编程与线程同步
- Java 多线程编程
- 横竖屏切换和contentView的三种显示方式
- Linux下压缩解压缩命令详解
- Android OkHttp完全解析 是时候来了解OkHttp了
- JAVA初学者第一个程序“Hello World”常见的错误及处理方法
- R语言之创建数据集
- git push -u origin XXX 报错
- Codeforces 519E A and B and Lecture Rooms [倍增法LCA]
- linux 中的vim的配置文件的位置
- 在ubuntu14.04上安装postgis1.5
- 【小镇的技术天梯】从头开始写算法,C语言hash表
- <use/>_MyEclipse2013_Chrome49
- IBM MQ 消息队列生僻字解决方法
- Struts中<s:select></s:select>标签使用介绍
- 五险一金