poj1330 lca倍增算法模板
来源:互联网 发布:mac识别不了u盘启动盘 编辑:程序博客网 时间:2024/06/05 03:54
上一套基于二分搜索的lca倍增算法模板
#include<algorithm>#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>#include<string>#include<stack>#include<queue>#include<cmath>#include<stack>#include<list>#include<map>#include<set>typedef long long ll;#define exp 1e-8#define up(i,x,y) for(i=x;i<=y;i++)#define down(i,x,y) for(i=x;i>=y;i--)#define mem(a,x) memset(a,x,sizeof(a))using namespace std;const int N = 5005*2;//最大节点个数const int MAX_LOG_V =25;//比最大深度大一点就好vector<int>G[N];int root;int parent[MAX_LOG_V][N];int depth[N];int f[N];void dfs(int v,int p,int d){ parent[0][v]=p; depth[v]=d; for(int i=0;i<G[v].size();i++) { if(G[v][i]!=p)dfs(G[v][i],v,d+1); }}void init(int V){ dfs(root,-1,0); for(int k=0;k+1<MAX_LOG_V;k++) { for(int v=0;v<V;v++) { if(parent[k][v]<0) parent[k+1][v]=-1; else parent[k+1][v]=parent[k][parent[k][v]]; } }}int lca(int u,int v){ if(depth[u]>depth[v])swap(u,v); for(int k=0;k+1<MAX_LOG_V;k++) { if((depth[v]-depth[u])>>k&1) v=parent[k][v]; }//使u和v的深度相同 if(u==v)return u;//深度相同且恰好为同一个节点 直接return for(int k=MAX_LOG_V-1;k>=0;k--)//找到u和v的最近公共祖先 { if(parent[k][u]!=parent[k][v]) { u=parent[k][u]; v=parent[k][v]; } } return parent[0][u];}int main(){ int T,i,j,k,m,n; scanf("%d",&T); while(T--) { scanf("%d",&n); for(i=0;i<N;i++) { G[i].clear(); } mem(f,-1); for(i=1;i<=n-1;i++) { int a,b; scanf("%d%d",&a,&b); f[b-1]=a-1;//求root的编号 习惯从0开始编号 G[a-1].push_back(b-1);//双向图 G[b-1].push_back(a-1); } for(i=0;i<n;i++)//求root的编号 { if(f[i]==-1) { root=i; break; } } //mem(parent,-1); init(n); scanf("%d%d",&i,&j); printf("%d\n",lca(i-1,j-1)+1); }}
阅读全文
0 0
- poj1330 lca倍增算法模板
- 【LCA倍增模板】【poj1330】最近公共祖先
- poj1330 倍增LCA
- LCA倍增算法(模板)
- lca倍增算法模板
- lca离线算法模板(poj1330验证)
- 裸倍增模板 poj1330
- LCA之倍增算法模板
- poj1330 LCA模板题
- Poj1330 LCA模板题
- poj1330 LCA离线算法
- 倍增LCA poj1330 Nearest Common Ancestors
- LCA-倍增思想 POJ1330 Nearest Common Ancestors
- poj1330 Nearest Common Ancestors(lca,tarjan&倍增)
- poj1330 Nearest Common Ancestors LCA倍增法
- 算法模板——倍增求LCA
- poj1330 LCA 屯个模板
- 【poj】lca模板题 poj1330
- 简单c语言汇编后代码解释(1)
- 顺序表的实现以及简单的 插入,删除,查找,输出操作
- 关于spring boot整合mybatis使用oracle数据库出现could not load:oracle.jdbc.driver.OracleDriver问题的终极解决方案
- python 获取文件下所有文件或目录os.walk()
- 虚拟机 VM tcsetattr fd1: input/output error解决方法
- poj1330 lca倍增算法模板
- myeclips安装svn插件的方法
- 经典排序算法--冒泡排序
- putty上执行后台运行命令失效
- MySQL中查询后用查询结果当删除的判断条件,进行删除操作
- 【hihocoder】#1566 : 皇室成员的名字[Offer收割]编程练习赛25
- C语言形参和实参
- 输入与Module
- python简单用户管理模拟