【模板】LCA Tarjan
来源:互联网 发布:淘宝联盟商品采集软件 编辑:程序博客网 时间:2024/06/09 16:53
- 基本介绍
- 模板题目
- 代码实现
基本介绍
Tarjan离线算法 这里用来做最近公共祖先
本来是想写一下Tarjan的做法
但是这个博客太好了(Vendetta BlogsJVxie的个人博客)
放这里一起学习吧
模板题目
题目描述
如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先。
输入输出格式
输入格式:
第一行包含三个正整数N、M、S,分别表示树的结点个数、询问的个数和树根结点的序号。
接下来N-1行每行包含两个正整数x、y,表示x结点和y结点之间有一条直接连接的边(数据保证可以构成树)。
接下来M行每行包含两个正整数a、b,表示询问a结点和b结点的最近公共祖先。
输出格式:
输出包含M行,每行包含一个正整数,依次为每一个询问的结果。
输入输出样例
输入样例:
5 5 4
3 1
2 4
5 1
1 4
2 4
3 2
3 5
1 2
4 5
输出样例:
4
4
1
4
4
样例说明
第一次询问:2、4的最近公共祖先,故为4。
第二次询问:3、2的最近公共祖先,故为4。
第三次询问:3、5的最近公共祖先,故为1。
第四次询问:1、2的最近公共祖先,故为4。
第五次询问:4、5的最近公共祖先,故为4。
故输出依次为4、4、1、4、4。
代码实现
=============================================================Tarjan LCA已修改=============================================================#include<iostream>#include<cstdio>#include<cstring>#include<cctype>using namespace std;#define in =read()#define ll long long const int size = 500000 + 50;ll n,m,s;ll site1,site2;ll head[size],father[size],vis[size],qhead[size],num[size];struct apoint{ ll x; ll y;}a[2*size];struct qpoint{ ll x; ll y; ll z;}q[2*size];inline ll read(){ ll num=0,f=1; char ch=getchar(); while(!isdigit(ch)){ if(ch=='-')f=-1; ch=getchar(); } while(isdigit(ch)){ num=num*10+ch-'0'; ch=getchar(); } return num*f;}ll find(ll x){ if(father[x]!=x)father[x]=find(father[x]); return father[x];}inline void unionn(ll x,ll y){ ll xx=find(x),yy=find(y); father[yy]=xx;}inline void add(ll x,ll y){ a[++site1].x=head[x]; a[site1].y=y; head[x]=site1;}inline void qadd(ll x,ll y,ll z){ q[++site2].x=qhead[x]; q[site2].y=y; q[site2].z=z; qhead[x]=site2;}inline void tarjan(ll x){ vis[x]=1; int y,z; for(int i=head[x];i;i=a[i].x){ y=a[i].y; if(!vis[y]){ tarjan(y); unionn(x,y); } } for(int i=qhead[x];i;i=q[i].x){ y=q[i].y; z=q[i].z; if(vis[y])num[z]=find(y); }}int main(){ n in; m in; s in; int x,y; for(int i=1;i<n;i++){ x in; y in; add(x,y); add(y,x); } for(int i=1;i<=n;i++)father[i]=i; for(int i=1;i<=m;i++){ x in; y in; qadd(x,y,i); qadd(y,x,i); } tarjan(s); for(int i=1;i<=m;i++){ printf("%d\n",num[i]); }}//COYG
阅读全文
0 0
- tarjan&&LCA模板
- 【模板】LCA Tarjan
- LCA之tarjan模板
- LCA Tarjan模板 HDU2586
- lca 离线tarjan模板
- LCA模板 Tarjan
- LCA离线tarjan算法模板
- HDU 2586 【LCA-Tarjan-模板】
- 单向无权LCA模板(Tarjan)
- LCA离线tarjan算法模板
- LCA Tarjan及倍增模板(POJ 1330)
- HDOJ2586 lca查询 tarjan模板程序
- 【模板】LCA Tarjan算法 (模板题:洛谷P3379)
- LCA离线模板(Tarjan)倍增模板 hdu2586
- Tarjan LCA
- Tarjan lca
- Tarjan LCA
- tarjan--lca
- JMeter压力测试post请求json参数来源文件
- 伸展树---(自顶向下的设计)
- Git是怎样生成diff的:Myers算法
- Get接口测试示例
- 几维安全分享你不知道的java反编译工具
- 【模板】LCA Tarjan
- 百度快照不更新或回档的10种原因
- Android仿淘宝头条竖直跑马灯式新闻标题及“分页思想”总结
- hadoop 命令
- 新闻案例
- 安装svn1.8.17,遇到sqlite3相关错误
- sap表维护工具来维护自定义表(转)
- J2EE系列之Spring4学习笔记(八)--AOP详解(AOP实例)
- 使用Anaconda和pip中的相关问题