HDOJ 4582 DFS spanning tree

题意: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是否有边被选择,就是看树状数组相

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值