Tarjan求割点和桥学习笔记

Tarjan求割点和割边

强连通分量:
若图 G G G 中的点两两可达,则称图 G G G 为强连通。
强连通分量的定义:极大的强连通子图。

割点:
在一个无向连通图图中,删掉顶点 u u u 及其相连的边以后,这个图不连通,点 u u u 为此图割点。

重连通图:
1.一个不含割点的连通图称为重联通图。

2.对于重联通的无向图来说,每对顶点至少存在两条路径。

3.在网络通信中,图中不应该有割点。

求割点:
1.暴力判断图连通性, O ( n ( n + e ) ) O(n(n+e)) O(n(n+e))

2.用Tarjan寻找割点时间复杂度为 O ( n + e ) O(n+e) O(n+e)
Tarjan:
首先 d f s dfs dfs 寻找一颗无向连通图 d f s dfs dfs 遍历后形成的深度优先生成树。
在深度优先生成树中的某个顶点 u u u 要么是根,要么不是根:

1.若顶点 u u u 为生成树的根:

1.1充要条件: u u u 是割点的充要条件: u u u 有两颗或以上的子树。
1.2判定:以 u u u 相连其中一个顶点 d f s dfs dfs 遍历,若能遍历完,则 u u u 不为割点

2.若顶点 u u u 不为根节点:

2.1充要条件:设 v v v

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Tarjan算法是一种用于解决最近公共祖先(LCA)问题的离线算法。离线算法指的是在读取所有查询之后一次性计算所有查询的答案,而不是每读取一个查询就计算一次。\[1\] 在Tarjan算法中,需要使用并查集来实现。并查集是一种数据结构,用于维护元素之间的集合关系。下面是一个并查集的模板代码: ```cpp int fa\[100000\]; void reset(){ for (int i=1;i<=100000;i++){ fa\[i\]=i; } } int getfa(int x){ return fa\[x\]==x?x:getfa(fa\[x\]); } void merge(int x,int y){ fa\[getfa(y)\]=getfa(x); } ``` 在Tarjan算法的伪代码中,首先标记当前节点为已访问状态。然后遍历当前节点的子节点,递归调用Tarjan函数并合并子节点。接下来,遍历与当前节点有查询关系的节点,如果该节点已经访问过,则输出当前节点和该节点的LCA(通过并查集的查找函数getfa获取)。\[3\] 以上是关于Tarjan算法解LCA的相关内容。 #### 引用[.reference_title] - *1* [Tarjan 算法解决 LCA 问题](https://blog.csdn.net/chengqiuming/article/details/126878817)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [详解使用 Tarjan LCA 问题(图解)](https://blog.csdn.net/weixin_34315485/article/details/93801193)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值