本总结是是个人为防止遗忘而作,不得转载和商用。
题目
给定某无向连通图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直接的边是割边。