LCA(Tarjan)
时间复杂度:dfs为O(N),dfs过程中处理所有查询对为O(M),总时间复杂度O(N+M)
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=500010, maxm=500010;
int N, M, S, tot, h[maxn], v[maxn], fa[maxn], p_tot, p_h[maxn];
struct edge{ int t, nxt; }E[maxn<<1]; //链式前向星,用于存储树
void add_edge(int u, int v){ E[++tot].t=v; E[tot].nxt=h[u]; h[u]=tot; }
struct pair{ int s, t, lca, nxt;}P[maxm<<1]; //链式前向星,用于存储查询对
void add_pair(int s, int t){ P[++p_tot].t=t; P[p_tot].s=s; P[p_tot].nxt=p_h[s]; p_h[s]=p_tot; }
inline int read()
{
int s=0, w=1; char ch=getchar();
while(ch<='0' || ch>'9') { if(ch=='-') w=-1; ch=getchar(); }
while(ch>='0' && ch<='9'){ s=s*10+ch-'0'; ch=getchar(); }
return s*w;
}
int getfa(int k){ return fa[k]==k ? k : fa[k]=getfa(fa[k]); } //并查集的查询,带路径压缩
void lca_tarjan(int x)
{
v[x]=1, fa[x]=x; //x点已访问,设置其fa为自己,形成以x为根的一颗独立子树
for(int i=h[x]; i; i=E[i].nxt)
if(!v[E[i].t]) lca_tarjan(E[i].t), fa[E[i].t]=x; //递归结束后再建立x与x儿子的父子关系
for(int i=p_h[x], y; i; i=P[i].nxt) //查找与x有关的所有lca询问
if(v[y=P[i].t]){ //对于某个询问(x, y),如果y已经访问过了,lca(x, y)=getfa(y)
P[i].lca=getfa(y);
if(i%2) P[i+1].lca=P[i].lca; //P数组中pair是成对存入的,一个是(x, y), 一个是(y, x)
else P[i-1].lca=P[i].lca;
}
}
int main(){
N=read(); M=read(); S=read();
for(int i=1, x, y; i<N; i++){ x=read(); y=read(); add_edge(x, y); add_edge(y, x); }
for(int i=1, a, b; i<=M; i++){ a=read(); b=read(); add_pair(a, b); add_pair(b, a); }
lca_tarjan(S);
for(int i=1; i<=p_tot; i++)
if(i%2) printf("%d\n", P[i].lca);
return 0;
}
LCA(Tarjan)的更多相关文章
- HDU 2874 Connections between cities(LCA Tarjan)
Connections between cities [题目链接]Connections between cities [题目类型]LCA Tarjan &题意: 输入一个森林,总节点不超过N ...
- POJ 1986 Distance Queries(LCA Tarjan法)
Distance Queries [题目链接]Distance Queries [题目类型]LCA Tarjan法 &题意: 输入n和m,表示n个点m条边,下面m行是边的信息,两端点和权,后面 ...
- LCA Tarjan方法
LCA Tarjan方法 不得不说,高中生好厉害,OI大佬,感觉上个大学好憋屈啊! 说多了都是眼泪 链接拿去:http://www.cnblogs.com/JVxie/p/4854719.html
- LCA tarjan+并查集POJ1470
LCA tarjan+并查集POJ1470 https://www.cnblogs.com/JVxie/p/4854719.html 不错的一篇博客啊,让我觉得LCA这么高大上的算法不是很难啊,嘻嘻嘻 ...
- hihoCoder #1067 : 最近公共祖先·二 [ 离线LCA tarjan ]
传送门: #1067 : 最近公共祖先·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上上回说到,小Hi和小Ho用非常拙劣——或者说粗糙的手段山寨出了一个神奇的网站 ...
- LA 5061 LCA tarjan 算法
题目大意: 给定所有点的权值都为0,给定一棵树以后,每次询问都要求给定两点 x , y 和一个权值w,要求x,y路径上所有点权值加上w,最后求出每一个节点的值 这里因为查询和点都特别多,所以希望能最后 ...
- [CF 191C]Fools and Roads[LCA Tarjan算法][LCA 与 RMQ问题的转化][LCA ST算法]
参考: 1. 郭华阳 - 算法合集之<RMQ与LCA问题>. 讲得很清楚! 2. http://www.cnblogs.com/lazycal/archive/2012/08/11/263 ...
- 最近公共祖先LCA(Tarjan算法)的思考和算法实现
LCA 最近公共祖先 Tarjan(离线)算法的基本思路及其算法实现 小广告:METO CODE 安溪一中信息学在线评测系统(OJ) //由于这是第一篇博客..有点瑕疵...比如我把false写成了f ...
- POJ 1330 Nearest Common Ancestors(LCA Tarjan算法)
题目链接:http://poj.org/problem?id=1330 题意:给定一个n个节点的有根树,以及树中的两个节点u,v,求u,v的最近公共祖先. 数据范围:n [2, 10000] 思路:从 ...
- Network POJ - 3694 (LCA+tarjan+桥)
题目链接:https://vjudge.net/problem/POJ-3694 具体思路:首先可以通过缩点的方式将整个图变成一个树,并且树的每条边是桥,但是我们可以利用dfn数组将整个图变成树,这样 ...
随机推荐
- Cs231n课堂内容记录-Lecture 6 神经网络训练
Lecture 6 Training Neural Networks 课堂笔记参见:https://zhuanlan.zhihu.com/p/22038289?refer=intelligentun ...
- June. 24th 2018, Week 26th. Sunday
Beautiful things don't ask for attention. 真正美丽的东西,并不会刻意寻求别人的注目. From The Secret Life of Walter Mitty ...
- IDEWorkspaceChecks.plist文件是干什么用的?
在提交PR的时候,无意间发现了在xcworkspace/xcshareddata中多了一个名为IDEWorkspaceChecks.plist的文件.自己并没有手动创建此文件,在网上查了一下,最终对其 ...
- shell杀死指定端口的进程
杀死端口代码如下: lsof -i: kill - PID 上面的与下面的代码作用相同. 命令如下所示(这种方式更自动化): kill - $(netstat -nlp | grep : | awk ...
- 使用jprofiler分析dump文件一个实例
3 .dump 线上文件栈 [root@yszyz10a153 ~]# jmap -dump:live,format=b,file=heap201712.hropf 72947 参考:https:/ ...
- 4-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(为域名申请SSl证书)
3-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(购买域名,域名绑定IP) 然后就是等着..... 假设可以了 咱呢是配置MQTT实现SSL安全加密通信,所以 ...
- map和unordered_map的差别和使用
map和unordered_map的差别还不知道或者搞不清unordered_map和map是什么的,请见:http://blog.csdn.net/billcyj/article/details/7 ...
- Spring Security Oauth2 的配置
使用oauth2保护你的应用,可以分为简易的分为三个步骤 配置资源服务器 配置认证服务器 配置spring security 前两点是oauth2的主体内容,但前面我已经描述过了,spring sec ...
- (hdu)4858 项目管理 (vector)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4858 Problem Description 我们建造了一个大项目!这个项目有n个节点,用很多边连接起 ...
- 关于gitee代码上传下载
1.在gitee上面创建新分支: 2.复制本地ssh秘钥(C:\Users\Administrator\.ssh) 添加到 gitee设置页面的ssh:(如果之前没有秘钥,就执行ssh-keygen ...