Tarjan
Tarjan求LCA
思路:并查集+ D F S DFS DFS(离线)。
时间复杂度: O ( N + Q ) O(N+Q) O(N+Q)。
对于 L C A ( u , v ) LCA(u,v) LCA(u,v):
-
u u u是 v v v的祖先, L C A ( u , v ) = u LCA(u,v)=u LCA(u,v)=u。
-
u u u不是 v v v的祖先,且 L C A ( u , v ) = k LCA(u,v)=k LCA(u,v)=k。
当 u u u所在子树遍历完,访问到 v v v时, L C A LCA LCA为 u u u所在子树的父亲节点即为 k k k。
利用并查集记录某一子树结点相对于其他子树结点的父亲结点。
例题:商务旅行
Tarjan求割点
在一个联通的无向图中,若删了 u u u与和 u u u相连的边,这个图变为非连通图, u u u即为这个图的割点。
重连通图:一个不含割点的连通图。
Tarjan求割点时间复杂度: O ( n + e ) O(n+e) O(n+e)。
-
建立一个无向连通图的 D F S DFS DFS遍历后形成的深度优先生成树。(不必刻意构造)
-
分类讨论:
若顶点 u u u是生成树的根;
u u u是割点的充分条件: u u u有两棵或两棵以上的子树。
判定方法:从顶点相邻的某个顶点做遍历,若所有顶点都被标记,这说明 u u u只有一棵子树。
若 u u u不是生成树的根;
假设 v v v是 u u u的一个孩子,则 u u u为割点:在 v v v或 v v v的子孙节点和 u u u的祖先结点无回边。
引入 D F N u DFN_u DFNu与 L u L_u Lu。
D F N n DFN_n DFNn: D F S DFS DFS序。
L u L_u Lu:从顶点 u u u出发能到达的点(父结点除外)的最小深度优先数。
L u = { D F N u m i n { L v ∣ 在 生 成 树 中 , v 是 u 的 孩 子 } m i n { D F N v ∣ 在 生 成 树 中 , ( u , v ) 是 一 条 回 边 } L_u=\begin{cases}DFN_u\\min\{L_v|在生成树中,v是u的孩子\}\\min\{DFN_v|在生成树中,(u,v)是一条回边\}\end{cases} Lu=⎩⎪⎨⎪⎧DFNumin{Lv∣在生成树中,v是u的孩子}min{DFNv∣在生成树中,(u,v)是一条回边}
定理:满足大条件的前提下,若 v v v是 u u u的一个孩子,使得 D F N u ≤ L v DFN_u\le L_v DFNu≤Lv,则 u u u为割点。
Tarjan求割边
在一个连通的无向图中,若删去一条边使得这个图不连通,这条边即为这个图的割边。
定理:在无向连通图的 D F S DFS DFS树, u u u是 v v v的父亲,若 u − v u-v u−v是割边:这条边不是重边并且 v v v或 v v v的子孙没有指向 u u u或 u u u祖先的回边。
方法与割点类似。
若 D F N u < L v DFN_u<L_v DFNu<Lv即为所求。