提示
dfs
桥
删掉该边,影响图的连通性
桥判定法则:
x以外的任一结点,均不是y的祖先结点。
表示成代码:
割点
讲解
https://www.luogu.com.cn/blog/acking/solution-p3388
https://www.cnblogs.com/collectionne/p/6847240.html
https://blog.csdn.net/weixin_45819197/article/details/109600168?utm_source=app&app_version=5.0.1&code=app_1562916241&uLinkId=usr1mkqgl919blen
https://www.luogu.com.cn/blog/taoran/solution-p3388 代码
只有F(i,1,n)里有一个小小的t=0
但那我也终于放心了,dfn的赋值
代码
dfn数组:dfs顺的时间戳
low数组:i结点不走dfs能回到的最远的祖先结点(远是以dfs起始结点为最远的根结点而言的)
即在结点i处,low记录的路径和dfs记录的路径合并以后,就形成了一条以i结点自身为起点和终点的完整的回路。
如图的2 5 1 2,2的dfs路径1 2是显然的,而根据low数组的记录,2可以回到祖先结点1,即有路径2 ... 1,故这就有一个回路经过2结点。
而如果一个结点或者说一个连通块的代表性结点,只有dfs路径,即只有一条自上而下到达该结点的路径,却没有自下而上回到父结点以外的祖先结点去的路径,并且此时的父结点不是跟结点,即存在另一个连通块,那么此时的这个父结点就是割点了。
连通块这个概念的提出很好,其实就是递归,类比于树的定义。
割点是low[子]>=dfn[父]
而桥是low[子]>dfn[父]
图解
此时34单向连通,3是割点,34是桥。
而分析代码可知,此时
low[4]=4
low[3]=3
此时34双向连通,3是割点,但34不是桥。
分析代码可知,此时
low[4]=4
low[3]=3
因为没有if(i==father)的情况,还是被彻底跳过了,所以没有任何变化
但是像4这样被切掉,就剩下一张图的,或许也不是割点??比较边界的情况了
复杂图片出处
https://www.cnblogs.com/c202202chenkelin/p/13910361.html
复杂图解读
dfs顺序
vis数组作用:
控制路径无环,即保证生成的路径是树
如果结点被访问过,则第二次访问时,比较是否是祖先结点
经过反复仔细的确认,我还是觉得书上这个代码漏了讨论i==father的情况