题目大意:
最小顶点覆盖问题是一个传统的NP完全问题,就是多项式复杂程度的非确定性问题。现在告诉你一个此问题的近似解法,算法的主要思想是遍历每个顶点,贪心的选取当前未被选取的点中的与另外的点相连数目最多的顶点,相连数目相同时选序号靠后的那个点。伪代码实现如下:
1 | for (int i = 1; i <= n; ++i) { |
现在要你找出一组数据来,使得按照他的方法跑出来的结果是最优解的3倍以上。
解题思路:
题目中给出的思路显然是不对的,hack掉这个程序的关键就是当数目相同时他去掉的是靠后的那个点
。
我们可以构造两组点,使得左边的那一组为正确答案,右边的为按照他的算法得出的答案。正确答案为左边,假设有n个点,先在右边构造n个点,和左边的一一相连;然后再在右边构造$\lfloor \frac{n}{2} \rfloor$个点,使得这些点依次与{1、2}、{3、4}……这些点相连,最后不足以连接的就不连;然后再在右边构造$\lfloor \frac{n}{3} \rfloor$个点,进行连接;……;直至构造了1个与n个点相连的点。
上面的构造方法就是根据前面的漏洞制定的,最后确定一下n为多少就好了。因为要求$3 * n \leq \sum_{i=1}^n{\lfloor \frac{n}{i} \rfloor}$, 所以n = 15就够了。
Mycode:
1 |
|