最近公共祖先两种算法小结.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
最近公共祖先两种算法小结 *Cyxgrtx(/) 最近公共祖先Lowest Common Ancestors,简称LCA),对于有根树T的两个结点u、v,最近公共祖先LCA(u,v)表示一个结点x,满足x是u、v的祖先且x的深度尽可能大,也可理解为中u到v中深度最小的点(取自百度百科) LCA常用的两种算法倍增tarjan算法(当然,还有其他算法)树上算法是一种在线算法,tarjan是离线算法(在线离线算法百度一下O(∩_∩)O~~) 倍增算法| dfs+| O(nlogn) (建议先去了解中的ST算法 我们先定义的,那么对于0]就是i的父亲节点。初步了解过算法的话,不难想到 (p.s:f[1][23]=f[ f[1][22] ][22],第1个结点的第为第一个节点的第四个祖先的第四个祖先初始状态和动态转移方程,我们便不难求出f[n][m]) 接下来需要针对每一询问得到的需要一个dep数组表示每个结点的深度。 结点v它们的最近公共祖先在同一深度上,所以我们先u、v同一深度上。只需要深度差,只需要用二进制表示深度向上找就行了这就是倍增思想O(log n)。 如果同一深度但并不是同一个祖先,我们就需要让u、v同时,找到。循环由小到大,这样才能得到最近的公共祖先。 //CodeVs 1036 #includecstdlib #includecstdio #includecstring #includealgorithm #includecmath #define For1(x, y) for(int i=x; i=y; i++) #define LFor(x, y) for(linklist *j=y[x].next; j; j=j-next) #define For2(x, y) for(int i=x; i=y; i--) #define N 30100 #define M 17 using namespace std; int n,m; struct linklist{int s, val; linklist *next;}; linklist t[N]; int dep[N]; int f[N][M]; int vis[N]; int dis[N]; void insert(linklist x, int y, int val) { linklist *t=new(linklist); t-next=x.next;t-val=val; t-s=y;x.next=t; } void dfs(int x, int d) { vis[x]=1;dep[x]=d; LFor(x,t){ if (!vis[j-s]) { dis[j-s]=dis[x]+j-val; dfs(j-s, d+1); f[j-s][0]=x; } } } void ST() { for(int j=1; jM; j++) For1(1,n) f[i][j]=f[f[i][j-1]][j-1]; } void init() { memset(vis, 0, sizeof(vis)); memset(dep, 0, sizeof(dep)); memset(dis, 0, sizeof(dis)); scanf(%d, n); For1(1,n-1) { int x, y,val; scanf(%d %d, x, y); insert(t[x], y, 1);insert(t[y],x, 1); } dfs(1,1); ST(); } void swap(int x, int y){x=x^y;y=x^y;x=x^y;} int Lca(int u, int v) { if (dep[u]dep[v]) swap(u,v); int d=dep[u]-dep[v]; For2(M-1,0) if ((1i)d) u=f[u][i],printf(%d %d\n, i, u); if (u==v) return u; For2(M-1,0) if (f[u][i]!=f[v][i]) u=f[u][i],v=f[v][i]; return f[u][0]; } void query() { int x,y; int ans=0; scanf(%d, m); scanf(%d, x); For1(2,m){ scanf(%d, y); if (x!=y) { ans+=dis[x]+dis[y]-2*dis[Lca(x,y)]; } x=y; } printf(%d, ans); } int mai

文档评论(0)

lyxbb + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档