图论割点割边

1. 割点:如果去掉一个点以及与它连接的边,该点原来所在的图被分成两部分(不连通),则称该点为割点。

 

2. 割边:如果去掉一条边,该边原来所在的图被分成两部分(不连通),则称该点为割边。

 

二,tarjan算法的应用

 

1. 变量说明:

 

① vector<int> edge[1000]; 存储边的信息

 

② bool cut[1000], bridge[1000][1000];

 

cut[x] == true 代表x为割点

 

bridge[x][y] == true代表边xy为割边

 

③ low[1000], dfn[1000], vis[1000]

 

2. 重要的两个数组 low 和 dfn:

 

① dfn:代表该节点被访问的次序。对于数组 dfn ,使用一个全局变量tim进行赋值,每访问到一个新节点 X ( 即vis[X]==0 ),则 dfn[X]=tim++;

 

② low[X]:代表 X节点与X节点的子树 能回溯到的 最小的dfn值。

 

什么是回边?什么时候需要进行low值的回溯更新?

 

初始化三个数组的值均为零

一开始按1->2->3->4访问,未遇到回边

 

可以发现,对于每一条回边,都是指向了dfn值更小的点。

 

在每个递归程序结尾的回溯更新父亲节点low值,即low[父亲节点] = min ( low[父亲节点],low[子节点] )

三,判断割点和割边

 

1, 割点:

 

①该点为根节点时,若子树数量大于一则说明该点为割点(子树数量不等于与该点连接的边数)。

 

②该点不为根节点时,若存在一个儿子节点的low值大于或等于该点的dfn值时(low[子节点] >= dfn[父节点]),该点为割点(即子节点,无法通过回边,到达某一部分节点(这些节点的dfn值小于父亲节点))。

 

2, 割边:对于任意有边连接的点u,v ,若low[u] > dfn[v],则说明边u-v为一条割边。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值