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)

  1. u u u v v v的祖先, L C A ( u , v ) = u LCA(u,v)=u LCA(u,v)=u

  2. 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,vu}min{DFNv,(u,v)}

    定理:满足大条件的前提下,若 v v v u u u的一个孩子,使得 D F N u ≤ L v DFN_u\le L_v DFNuLv,则 u u u为割点。

Tarjan求割边

在一个连通的无向图中,若删去一条边使得这个图不连通,这条边即为这个图的割边。

定理:在无向连通图的 D F S DFS DFS树, u u u v v v的父亲,若 u − v u-v uv是割边:这条边不是重边并且 v v v v v v的子孙没有指向 u u u u u u祖先的回边。

方法与割点类似。

D F N u < L v DFN_u<L_v DFNu<Lv即为所求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值