算法思路
TraJon 离线算法O(n + m);
在线做法:边读边做
离线做法:先读完,再全部处理,最后全部输出。
Tarjon本质就是对向上标记法的一个优化,任取一个节点当成根节点进行dfs优先遍历,把所有节点分成三部分
1)已经遍历并且回溯的标记成2
2)正在遍历的没有回溯的标记成1
3)未遍历的标记成0
注意:顺序一定不能乱。
1)当这个点遍历子节点后的时候把子节点的祖宗更新成当前点
2)只有当前点回溯的时候才可以用这个点来计算所有之前为2的点,因为如果当前点为a,而b是a这条路径的上的点,并且b在a的下面,那么因为b先回溯,所以要等b回溯了之后才能正确的判断a.
3)加入询问的时候要加入两次
num[a].push_back = {b, i}, num[b].push_back(a, i};