计算无向连通图的割点和割边

本总结是是个人为防止遗忘而作,不得转载和商用。

题目

         给定某无向连通图G,若删除某节点X和已经与X相邻接的所有边时,图G变成非连通图,则节点X称为图G的割点。

         如:对于下图,删除点B之后,DE和除了BDE之外的那一块就不连通了,这样这个图就成为了非连通图。

                  

         问:给定上图的邻接矩阵或邻接表,如何计算改图的所有割点。

                  

思路解析

         该题的技巧是深度优先搜索。

         定义:

                  节点i,j,k为图中的三个点,其中:

                            i和j相邻,且j在i后面

                            j可以通过除了i - j边之外的边访问到k,且k是j可以访问到的最早的节点。

         然后分情况讨论i和k的先后:

                  情况1:先访问k在访问i,则这时如果把i砍了的话,j是可以通过别的路径和k连通的(因为j和k是连通的啊),这样的话j是可以和k之前的那些节点保持连通。

                  情况2:先访问i在访问k,这时如果把i砍了的话,j只可以回到k,于是就和i之前的节点断了,这时i就是割点。

 

         话说,虽然上面的思想蛮好的,但前提是知道访问顺序啊,所以我们需要记录下访问顺序。因此需要添加如下数据结构:

                   1,记录访问先后顺序的数组,我们胡乱起个名字dfn,dfn[i]处的节点就是第i次被访问的节点。

                   2,记录某节点往回看时能找到的最小的节点编号的数组,我们再胡乱七个名字low,low[j]就是dfn中的第j号节点往回看时能找到的最小的节点编号。

         于是,如果dfn[i] ≥ low[j],则i是割点。

         最后再补充一个条件,对于根节点,如果有超过2条或2条以上的深度优先搜索路径,即:根节点有2个或2个以上子树的话,则根节点也是个割点。

进一步思考

         给定某无向连通图G,若删除某边E,则图G变成非连通图,则边E成为图G的割边。

         问:给定某图的邻接矩阵或邻接表,如何计算该图的所有割边。

         思考方式同样:

                  i指向j,j有个指向的最早的点k,dfn[i] <low[j] 时(之前是≤,这里是<),则i和j之间的边就是割边。

         总之:

                  如果j通过别人(不通过i),最远可以追述到i,那把i删掉就无法和别人连通了,所以≤时,i是割点。

                  如果j通过别人(不通过i),最远可以追述到k,比如:i是第10次访问的,但j追述的最早的是11、12或其他什么,反正就是到不了10,那就意味着从i到j的这条边是很关键的,如果边断掉的话,通过其他边就到不了10,所以<时,i和j直接的边是割边。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值