• COGS 2416.[HZOI 2016]公路修建 & COGS 2419.[HZOI 2016]公路修建2 题解


    大意:

    [HZOI 2016]公路修建

    给定一个有n个点和m-1组边的无向连通图,其中每组边都包含一条一级边和一条二级边(连接的顶点相同),同一组边中的一级边权值一定大于等于二级边,另外给出一个数k(k<=n-1),求原图的一个生成树,使得其中至少包含k条一级边且最大的边权值尽量小。

    [HZOI 2016]公路修建2

    和上一题基本一样,但是求出的不一定是生成树(也就是说可以有多于n-1条边,只要让图连通即可),在此前提下仍然使得其中至少包含k条一级边且最大的边权值尽量小。

    解法:

    两题均可以使用贪心算法解决,但是由于两题对最终总边数的要求不同,使用的贪心算法也就差别甚远。

    对于第一题,可以先对一级边跑一遍Kruskal建出k条边,然后再对二级边跑一遍Kruskal建出剩下的边。

    这个算法比较直观,但正确性需要我们进行证明。不过dbw神犇确实给出了一个证明,在此致以崇高的敬意。

    这里给出我自己的证明,首先分两种情况:

    1.最大边是一级边

    这样用Kruskal求出的不完整生成树中包含的一定是尽量小的k条一级边,因此这种情况下这个算法得到的解不会比最优解更差。

    2.最大边是二级边

    如果第二遍的Kruskal求出的最大边可以用一条比它更小的边替代,那么显然这条边不是二级边(因为第二遍Kruskal已经保证了这一点),但如果它是一级边的话,用它对应的二级边替换最大边显然不会比用一级边替代更差,但这种情况已经被推翻,因此这种情况下这个算法的解也不会比最优解更差。

    综上所述,此贪心算法成立。

    对于第二题,可以先对二级边直接跑一遍Kruskal求出最小生成树,再把权值前k小的一级边加入方案中即可。

    这个的正确性更加显然,不过还是给出证明。

    仍然分两种情况:

    1.最大边是一级边

    第二步已经保证了所选的一级边的方案不会存在更优解,这种情况下此算法正确。

    2.最大边是二级边

    第一步已经保证了所选的二级边方案不会存在更优解,故这种情况下此算法也正确。

    综上所述,此贪心算法成立。

    两题的解法叙述到此结束。

    后记:

    这两题题面极其雷同,解法也有共通之处(都是贪心+最小生成树),但造成两题最终算法产生如此巨大的差别的原因,就在于两题的一个小差距:

    第一题要求所求方案必须是生成树,第二题则只要求连通,边可以多选(这也是为什么不考虑一级边和二级边重了等情况的原因)。

    如果质疑为什么第一题的算法不可以解第二题,请参见第二题的样例。

    这两个题告诉我们,一定要好好读题,要不然看见第二题之后没好好读题直接按生成树写的就WA大吉了。

    顺便一提,这两个题都可以用二分答案,复杂度和贪心不相上下。

    支持你的

    最初是兴趣

    后来是梦想

    最终是使命

    233333333
  • 相关阅读:
    基于小程序开发的藏书馆
    picker(级联)组件及组件封装经验
    秒杀组件开发-可实现多种倒计时功能
    async/await 与 generator、co 的对比
    nodejs项目总结
    小程序开发小结-线下服务器域名部署等
    性能提速:debounce(防抖)、throttle(节流/限频)
    vuex数据管理-数据模块化
    vue 项目其他规范
    vue路由管理-保留滚动位置功能、按需加载模块名自定义
  • 原文地址:https://www.cnblogs.com/hzoier/p/5744518.html
Copyright © 2020-2023  润新知