13 成都 F

在成都的时候跪舔这道题目,确实让人不甘心,唯一能做的只是希望下一场能正常发挥吧。
这道题目因为陈题的关系吧,现场一血来的特别快,而且还成为了最水的一道题目。
题目大意:在10万个点的一个无向图中,所有的边不是黑边就是白边,现在给定所有边的属性,问判断是否能形成一颗生成树其中包括了斐波那契条白边。
解法:做法就是求一次最小生成树和最大生成树,那么所有生成树中能包含的白边就是 最小和最大之间的所有值,然后直接判断其中是否存在斐波那契数即可

证明:这个解法我们可以这样来想象,现在我们先把边排序,先处理黑边,再处理白边,采用克鲁斯卡尔算法,那么处理完黑边之后现在图中形成了一些森林。
接下来先进行第一种处理方法,按照普通的克鲁斯卡尔的做法,如果之前两个点已经在一个联通块中,那么我们就continue,这样求出来就是最小生成树的解,不能证明,这个值就是白边存在的最小值。

另外一种处理方法,对于之前黑边处理完之后留下的树(联通块可以看成一棵树),如果白边对应的两个点已经在一棵树当中了,因为要取到最大值,所以我们依然将白边加入,那么生成树中形成了一个环,我们必须删去一条黑边来让保证树的结构。那么这个环中如果存在一条黑边,那么就可以删去,否则只能删去白边(那么总的白边数还是没有增加),不能删去白边的充要条件就是环全部由白边构成,那么等价的我们在处理完黑边之后,我们新维护一个并查集(初始化所有点都是独立的),那么假如一条白边之后就将那两个点连在一起,那么这个新的并查集联通块中所代表的含义不就是整个树都是由白边构成的,如果有一条黑边,就不会在一个联通块里面,所以不在一个联通块中,就可以成功加入白边用来白边数加一,仔细想一下这个流程,不就是对应了最大生成树嘛。

总结了 就是说生成树能取到最小生成树和最大生成树之间的任意一个数值,具体的想法可以这里方便理解,就是在做克鲁斯卡尔的过程中,可以依次用白边取替代黑边,这样子取代环并不会影响并查集,所以任意一个值都能取到!
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值