题意:n个点,m条边的无向图,通过DFS遍历,m条边中前面的n-1条边形成深度优先生成树,后面的自然就是形成环(没有自环)。问从DFS生成树中最少选择多少边,能够使得所有的环都至少有一条边在你选择的集合中。
题解:
考虑DFS生成树,必然没有横叉边(即一个孩子都另一个孩子的边,要不DFS就应该遍历过去),所有的环都是一个结点与它祖先结点的边形成的。
那么这题做法就是进行一次DFS遍历,在回溯的时候,到了now这个结点,那么从他引出的所有后m-n+1条边中,到达深度更深的那些边,也就是如果有now->to这么一条边且dep[now]<dep[to],那么在now结点上面选择边都不会影响到这一条边所形成的环,就意味着必须选择now到to之间的一条边。
由于是回溯时处理,所以需要判断是否now~to之间已经有边被选择了,那么我们考虑如果没有被选择,即现在需要进行选边操作:
有回溯处理操作可以看出,所有深度大于now的出发结点的边所形成的环都已经被处理了,没处理的边就只能是终点在now~to之间,且起点在now之上的边了,任意一种这种边必然会经过now->son,son代表从now到to所经历的第一个结点,那么删除这条边就是使得环减少最多的方案。这种贪心策略之所以正确,是因为在必然要选边的时候选择了能使得环数减少最多的边,选择其他边意味着后面会有一些环还需要选择边。
具体实现的话,就是先对DFS生成树进行树链剖分,生成一个树状数组,某个结点等于1意味着它到它父亲结点的边被选择了,判断now~to是否有边被选择,就是看树状数组相