File tree Expand file tree Collapse file tree 1 file changed +2
-2
lines changed
DFS/1192.Critical-Connections-in-a-Network Expand file tree Collapse file tree 1 file changed +2
-2
lines changed Original file line number Diff line number Diff line change 66
77简单地说,我们可以以任意一个未访问过的节点作为根节点,用DFS的顺序来进行搜索,即永远深度优先,然后回溯再搜索其他分支。如果碰到访问过的节点,就停止,保证不行成环。
88
9- 我们在dfs的过程中维护两个数组,一个是dfs [ u] ,表示节点u被第一次访问时的顺序(可以理解为时间戳),这个是唯一且不变的量。另一个数组low[ u] 比较关键,初始的时候``` low[u]=dfn[u] ``` 。我们以u为节点的开始dfs(注意抵达u之前可能还有u的父节点,但我们dfs的时候不走回头路),想象它最终形成一棵搜索树,那么u的所有子节点中止的条件不外乎有两个:一个是走进了死胡同;另一个就是遇到了已经访问过的节点,特别的,这个已经访问过的节点有可能是u的祖先节点!所以,有了这样的搜索树之后,low[ u] 可以有机会更新为它所有的子节点v可以接触到的最小时间戳low[ v] 。
9+ 我们在dfs的过程中维护两个数组,一个是dfn [ u] ,表示节点u被第一次访问时的顺序(可以理解为时间戳),这个是唯一且不变的量。另一个数组low[ u] 比较关键,初始的时候``` low[u]=dfn[u] ``` 。我们以u为节点的开始dfs(注意抵达u之前可能还有u的父节点,但我们dfs的时候不走回头路),想象它最终形成一棵搜索树,那么u的所有子节点中止的条件不外乎有两个:一个是走进了死胡同;另一个就是遇到了已经访问过的节点,特别的,这个已经访问过的节点有可能是u的祖先节点!所以,有了这样的搜索树之后,low[ u] 可以有机会更新为它所有的子节点v可以接触到的最小时间戳low[ v] 。
1010
1111令v是u的一个子节点,且有``` low[v]>dfn[u] ``` ,这说明什么呢?说明从v出发最终无法绕道u的前面去。因此(v,u)就是割边。如果消除了这条边,v及其子树就是一个孤岛,无法与u或u的祖先相通。同理,如果``` low[v]>=dfn[u] ``` ,说明u是一个割点,如果消除了这个点,那么v及其子树也是一个孤岛。
1212
1313本题中我们还设置了一个parent,其实是为了标记dfs过程中的搜索顺序。因为无向图``` for auto v: next[u] ``` 的遍历过程中,v可能是u的父节点,这种情况下v其实不能作为从u开始dfs的下一个目的地(否则就是走回头路了),所以得排除。
1414
1515
16- [ Leetcode Link] ( https://leetcode.com/problems/critical-connections-in-a-network )
16+ [ Leetcode Link] ( https://leetcode.com/problems/critical-connections-in-a-network )
You can’t perform that action at this time.
0 commit comments