【算法】【LCA】【tarjan】【倍增】【RMQ】
呃,这个常用但是我一直不会 T a r j a n Tarjan 算法 基于 df s ,在 dfs 的过程中,对于每个节点位置的询问做出相应的回答。 dfs 的过程中,当一棵子树被搜索完成之后,就把他和他的父亲合并成同一集合;在搜索当前子树节点的询问时,如果该询问的另一个节点已经被访问过,那么该编号的询问是被标记了的,于是直接输出当前状态下,另一个节点所在的并查集的祖先;如果另一个节点还没有被访问过,那么就做下标记,继续 dfs 。 //tarjian,边建边 边回答问题 #include<cstdio> #include<cstdlib> #include<vector> using namespace std; int n,m,rt; const int N=500003,M=500003; int ans[M]; vector <int> e[N]; struct node { int v,id; node(int vv,int ii) { v=vv,id=ii; } node(){} }; vector <node> q[N]; int fa[N]; int find(int x) { return fa[x]==0?x:fa[x]=find(fa[x]); } bool vis[N]; void dfs(int x,int f) { int sz=e[x]