lca(最近公共祖先)倍增模板【pascal】
2016-11-14 21:37
323 查看
var n,m,root,x,y,l :longint; i,j :longint; last,d :array[0..500010] of longint; vis :array[0..500010] of boolean; pre,other :array[0..1000010] of longint; jump :array[0..500010,0..20] of longint; procedure connect(x,y:longint); begin inc(l); pre[l]:=last[x]; last[x]:=l; other[l]:=y; end; procedure dfs(x:longint); var p,q:longint; begin q:=last[x]; while (q<>0) do begin p:=other[q]; if not vis[p] then begin jump[p,0]:=x; vis[p]:=true; d[p]:=d[x]+1; dfs(p); end; q:=pre[q]; end; end; procedure swap(var a,b:longint); var c:longint; begin c:=a;a:=b;b:=c; end; function lca(x,y:longint):longint; var j:longint; begin if (d[x]>d[y]) then swap(x,y); for j:=0 to 15 do if ((d[y]-d[x]) and (1<<j)<>0) then y:=jump[y,j]; // if (x=y) then exit(x); if (x<>y) then begin for j:=15 downto 0 do if (jump[x,j]<>jump[y,j]) then begin x:=jump[x,j];y:=jump[y,j]; end; end; exit(jump[x,0]); end; begin read(n,m,root); for i:=1 to m-1 do begin read(x,y); connect(x,y); connect(y,x); end; // d[root]:=1;vis[root]:=true;dfs(root); for j:=1 to 15 do for i:=1 to n do jump[i,j]:=jump[jump[i,j-1],j-1]; // for i:=1 to m do begin read(x,y); writeln(lca(x,y)); end; end.——by Eirlys
相关文章推荐
- 【LCA倍增模板】【poj1330】最近公共祖先
- 【讲解+模板】最近公共祖先(LCA)(倍增)
- 洛谷 P3379 【模板】最近公共祖先(LCA) (在线倍增+离线Tarjan)
- (倍增)最近公共祖先(LCA)模板
- 求LCA最近公共祖先的在线倍增算法模板_C++
- LCA 最近公共祖先 (笔记、模板)
- 树剖——【模板】最近公共祖先(LCA)
- 洛谷3379 最近公共祖先模板(倍增)
- 最近公共祖先LCA(Tarjan与DFS--ST倍增)
- CodeVs.2370 小机房的树 ( LCA 倍增 最近公共祖先)
- [置顶] 倍增LCA(最近公共祖先)算法详解
- 洛谷P3379 【模板】最近公共祖先(LCA)(树链剖分)
- AC日记——【模板】最近公共祖先(LCA)洛谷 P3379
- 最近公共祖先(LCA)算法实现过程 【Tarjan离线+倍增在线+RMQ】
- 最近公共祖先:LCA及其用倍增实现 +POJ1986
- 洛谷 3379_【模板】最近公共祖先(LCA)
- 最近公共祖先(LCA):tarjan与倍增
- 4000 【模板】最近公共祖先(LCA)
- 洛谷 P3379 【模板】最近公共祖先(LCA)
- 图论--最近公共祖先问题(LCA)模板