关于Tarjan算法中用dfn不能用low的问题

在Tarjan算法中对于dfn[V] != 0的情况,low[U] = min(low[U], dfn[V]) ❶
而如果错写为low[U] = min(low[U], low[V]) ❷,可能导致答案错误

有向图的强连通分量 SCC

写成❷式可能导致low[U]算错,但一般不会影响最终答案(无向图的边双连通分量e-DCC似乎也是如此)

例如如下数据,就会导致low[U]的错误

5 6

1 2
2 3
3 4
3 1
4 5 
5 3

SCC0.png

注意这里到达3号点后先走向了1号点更新low[3],再走向4号点;如果先走向4号点,low[3]依然为3,此时low[4],low[5]就依然是3,例如将数据中“3 4”和“3 1”边的位置交换(这里用head邻接表存图,故后加入的边先遍历)

5 6 

1 2
2 3
3 1
3 4
4 5
5 3

无向图的点双连通分量 v-DCC

写成❷式可能导致low[U]算错,而且一般会使割点找的不正确,导致错误答案

例如如下数据,就会导致low[U]的错误

5 6

2 3
5 3
3 4
3 1
1 2
4 5

DCC0.png

同样注意这里到达3号点后先走向了1号点更新low[3],再走向4号点;如果先走向4号点,low[3]依然为3,此时low[4],low[5]就依然是3,3号点也会被正确判断成割点。例如换成如下数据(这里用head邻接表存图,故后加入的边先遍历)

5 6

2 3
3 1
3 4
5 3
1 2
4 5

当然如果分析有不正确的地方欢迎留言指正qwq~

posted @ 2021-08-02 14:11  Randolph、  阅读(210)  评论(0编辑  收藏  举报