zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    表单小知识
    HTML列表,表格与媒体元素
    P1008 三连击
    打鱼晒网问题
    最小编辑距离算法
    算法设计与分析--01背包问题(动态规划法解决)
    文件读写函数
    C语言中数据输入输出到文件操作freopen()函数(1)
    输入输出框架(未完待续)
    阶乘1到阶乘n的和
  • 原文地址:https://www.cnblogs.com/hzoier/p/5744518.html
Copyright © 2011-2022 走看看