SGOI8之《采集标本》解题报告
   
[题意简述]
  题目给出了星球的个数以及它们之间的连接关系 ,要求用最少的飞船遍历所有的的星球 ,且每个星球仅被到达一次 。

[算法分析]
  这道题给出了一张有向图,有向图中没有圈,一个点仅被访问一次 ,也就是说一个点仅存于一条飞行路线上,并且每次飞行可以从任意点开始和结束,这正是典型的路径覆盖的模型。因此,题目实际上就是要求最小路径覆盖数。
  我们把图中的每个顶点拆成两个顶点xi和yi,且若原图中点i到点j有边的话,则新图中在xi和yj间连一条边。可以看到,新图是一张二分图。由于题目保证了图中不存在圈,所以最小路径覆盖数=顶点数(原图 )-最大匹配数。我们采用匈牙利算法来求二分图的最大匹配。

[具体解法]
  设数组up[1..n] --- 标记二分图的上半部分的点。
     down[1..n] --- 标记二分图的下半部分的点。
     map[1..n,1..n] --- 表示二分图的上,下部分的点的关系。
          True-相连, false---不相连。
     over1[1..n],over2[1..n] 标记上下部分的已盖点。
     use[1..n,1..n] - 表示该条边是否被覆盖 。

  首先对读入数据进行处理 ,对于一条边(x,y) ,起点进集合up,终点进集合down。 标记map中对应元素为true。

  1. 寻找up中一个未盖点 。
  2. 从该未盖点出发 ,搜索一条可行的路线 ,即由细边出发, 由细边结束, 且细粗交错的路线 。
  3. 若找到 ,则修改该路线上的点所对应的over1,over2,use的元素。重复步骤1。
  4. 统计use中已覆盖的边的条数total,总数n减去total即为问题的解。

[解题心得]
  这道题并不难,但是如果对于图论的模型不熟悉的话,未必能够很快得到有效的算法。因此,我们应当熟练掌握各种基本算法,才能在解题过程中加以灵活应用。另外,对于现成的算法,我们也应当尽力优化,力求用简洁高效的代码来实现。

   

 
网站导航 | 关于曙光 | 联系我们 | 请提意见
Copyright © FuJian Sunshine Educational Info. Co.,Ltd.
福建曙光教育资讯有限公司 版权所有