博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Tarjan 离线求LCA
阅读量:5874 次
发布时间:2019-06-19

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

#include
using namespace std;const int maxn=450005;struct node{ int nxt; int to;}tree[maxn*2];struct node1{ int LCA; int nxt; int to;}qtree[maxn*2];int fa[maxn];int n,m,p,x,y,t;int cnt1,cnt2,head1[maxn],head2[maxn];int vis[maxn];void add1(int x,int y){ tree[++cnt1].nxt=head1[x]; tree[cnt1].to=y; head1[x]=cnt1;}void add2(int x,int y){ qtree[++cnt2].nxt=head2[x]; qtree[cnt2].to=y; head2[x]=cnt2;}int find(int x){ if(x!=fa[x]) fa[x]=find(fa[x]); return fa[x];}void dfs(int x){ vis[x]=1; for(int i=head1[x];i;i=tree[i].nxt){ int v=tree[i].to; if(vis[v]){ continue; } dfs(v); fa[v]=x; } for(int i=head2[x];i;i=qtree[i].nxt){ int v=qtree[i].to; if(vis[v]){ qtree[i].LCA=find(v); if(i%2) { qtree[i+1].LCA=qtree[i].LCA; } else qtree[i-1].LCA=qtree[i].LCA; } }}int rt;int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ fa[i]=i; } for(int i=1;i<=n;i++){ scanf("%d",&t); if(!t) rt=i; add1(i,t); add1(t,i); } scanf("%d",&m); for(int i=1;i<=m;i++){ scanf("%d%d",&x,&y); add2(x,y); add2(y,x); } dfs(rt); for(int i=1;i<=m;i++){ printf("%d\n",qtree[i*2].LCA); } return 0; }

 

转载于:https://www.cnblogs.com/LJB666/p/11017472.html

你可能感兴趣的文章
HttpClient连接池的连接保持、超时和失效机制
查看>>
1-4 多文档界面处理(2)
查看>>
《Essential Linux Device Drivers》中文版第1章
查看>>
让远程传输大文件变得更快
查看>>
complex的小困惑
查看>>
十进制、十六进制、二进制的转换
查看>>
双网卡centos7 iptables防火墙与/etc/rc.d/rc.local开机运行
查看>>
tomcat PermGen space 不足的解决方法
查看>>
STM32系统滴答_及不可不知的延时技巧 - (上)
查看>>
Linux下企业级分区方案
查看>>
CentOS下LAMP一键yum安装脚本
查看>>
拖来拖去今天终于重装系统了
查看>>
NestJS 脑图
查看>>
我的友情链接
查看>>
Html body的滚动条禁止与启用
查看>>
Tengine新增nginx upstream模块的使用
查看>>
多媒体工具Mediainfo
查看>>
1-小程序
查看>>
CentOS图形界面和命令行切换
查看>>
HTML5通信机制与html5地理信息定位(gps)
查看>>