• Gym 101673F Keeping On Track


    原题传送门

    题意:给定一颗n+1(n≤10000)个结点的树(当然有n条边辣),定义一个结点为critical,当且仅当除去这个点及与其相连的边后,所有不相连的结点对数量最多。现在保证有且仅有一个结点是critical的,要求输出对应的不相连的结点对数,以及连上一条边后,能剩余的最少结点对数(即等价于(n+1-最佳情况下能减少的不相连点对个数))。

    分析:明眼人一下就能看出,第二问比第一问简单多了,只要求出critical,然后O(n)跑一遍邻边统计最大的两个分支乘起来就是“最佳情况下能减少的不相连点对个数”了。

    鉴于CF机子很快,而这题只有104的数据规模,我上来直接码了一个暴力O(n2),即枚举critical的结点是哪一个,对于每个点都跑一遍所有邻边的dfs,数出不相邻的结点对数,求最大值。

    然而!大概因为这道题是ACM的题的关系吧?时限卡的很紧,O(n2)看来是卡不过去了。。

    超时代码

    既然超时了,我就只能另外想办法,如何更高效地求解第一个问题呢?其实可以O(n)——随便选个点开始dfs,对于每个点,我要求出与它相连的所有连通分量的结点个数,而这些问题可以依靠下面的dfs递归解决,这样就可以做到均摊的O(n),问题也就完美的解决了。

    AC代码

    其实在想O(n)的算法之前,我想的是另一种思路,来自TJW神犇的博客(好像是去年省选Round2?),就是把度数不小于√n的点取出来单独处理,因为这样的点至多√n个,即使跑暴力也只有O(n√n),剩余点如果能做到每个√n时间复杂度就好了(当然O(1)是最好的辣)。然而这样想就想多了,原来可以更简单。。

  • 相关阅读:
    文件共享锁定数溢出(AC等修改数据多出错)
    智能五子棋基本思路
    API与C#数据结构类型对应关系表
    读书释疑C#浅拷贝与深拷贝
    冒泡排序(C#数据结构学习九)
    希尔排序(C#数据结构学习八)
    fatal error LNK1169: 找到一个或多个多重定义的符号
    Solo Spirit系统精灵(含C#源码)
    插入排序(C#数据结构学习七)
    快速排序(C#数据结构学习十)
  • 原文地址:https://www.cnblogs.com/xuzihanllaa/p/8207084.html
Copyright © 2020-2023  润新知