洛谷 P3388【模板】割点(割顶) tarjan

这是一篇关于图论的博客,主要讲解如何利用tarjan算法求解无向图的割点问题。文章提供了详细的题意解析,以及判断割点的条件:根节点拥有多个子树或非根节点的子树中不存在指向其祖先的边。tarjan算法在处理树边和回边时有不同的更新low值的方法,并介绍了割边的判断条件:low[i]大于dfn[v]。
摘要由CSDN通过智能技术生成

题目链接

题意:给出一个n个点m条边的无向图,求其割点。

思路:tarjan求割点模板题。

tarjan(求割点):遍历整个图,则整个图可转化为一棵树(附带着有回边)。设置两个数组,dfn[i](记录搜索到i的时间),low[i](记录在i的子树中通过非父子边能够遍历到的最早的dfn)。

那么如何判断一个点是否是割点?一个点v有两种情况。

  1. v为树根,则当v有不止一棵子树时,v为割点。
  2. v非根节点,则当v的子树中没有边指向v的祖先时v为割点。(即v的孩子中存在i使得low[i]>=dfn[v])

现在已经知道怎么判断一个点是否为割点了,那如何求low?可以分为两种情况。

  1. 当edge(v,i)为树边时,low[v]=min(low[v],low[i])
  2. 当edge(v,i)为回边时,low[v]=min(low[v],dfn[i])

如果是求割边呢?

edge(v,i)当且仅当low[i]>dfn[v]时,为割边。

#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
#define NUM 110000
#define INF 0x3f3f3f3f
const int p &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值