NKPC7-2153-All Star Game

1. 概述

    这是NKPC7中的第一道题目,虽然AC了,但是后来发现方法是有问题的,主要是数据还不够严谨。另外,同学给出的一个贪心方法,经过一番思考也发现了问题。标准答案是枚举+判断,因此,这里主要总结走过的一些弯路。

2. 错误的AC方法

    顶点就是队伍,边是队伍的共存关系,如果两个队伍能够共存,则存在边,否则不存在边。最多能够共存的队伍就是最多的相互之间有边直接到达的顶点集合。
    首先,从每个顶点分别开始计算最大共存队伍数。在每次计算的时候,依次遍历其他的队伍,如果能够与已有队伍共存就加入进来。
    其次,选取前面得到的N个最大共存队伍数量的最大值,即为所得。
    反例:
   

    最大共存队伍是3,4,5。
    起始节点为0:{0,3},起始节点为1:{1,4},起始节点为2:{2,5}
    起始节点为3:{3,0},起始节点为4:{4,1},起始节点为5:{5,2}
    当起始节点为3时,由于先检查0号节点,发现可以共存,但是4和5都不能与0共存。因此,该方法得到的结果不是最优的。
    题目侥幸AC是由于在指定起始节点后,遍历其他节点时,从后向前遍历,而数据不够严谨。后来我重新程序,从前向后遍历,结果3个WA,才发现了问题。

3. 错误的贪心方法

    同学给出的。建图方式和前面的正好相反:如果两个队伍之间有相同的队员(即不能共存)时,则存在边。目标是通过合理的删除一些顶点,得到最多的没有边的顶点集合。
    方法是每次删除度最大的节点,更新图,再删除度最大的节点,直到图中不再有边为止。

    伪码:  while(图中边数>0) {
               删除度最大的节点
               更新图
             }

    反例:
     

    最大共存队伍:{0,4,5,6,7,8,9},但是由于0,1,2,3的度都是3,开始可能先删除0号节点,如果先删除0号节点,那么,最后,只能得到{4,5,6,7,8,9},不是最优解。

   反例:

    

    这里,0号节点的初度最大,因此,必然会先删除0号节点。因此方法不能得到最优解。

4. 标准答案

    标准答案说明:枚举+判断。N<=20,这样搜索的范围是2^20,大约在10^6的范围,搜索过程剪枝还是相对容易。比如:当前剩余节点都算上也不够的情况。

5. 题目网址

   http://acm.nankai.edu.cn/p2153.html

posted @ 2011-05-03 13:05  xiaodongrush  阅读(278)  评论(0编辑  收藏  举报