[题意简述]
题目给出了星球的个数以及它们之间的连接关系 ,要求用最少的飞船遍历所有的的星球 ,且每个星球仅被到达一次 。
[算法分析]
这道题给出了一张有向图,有向图中没有圈,一个点仅被访问一次 ,也就是说一个点仅存于一条飞行路线上,并且每次飞行可以从任意点开始和结束,这正是典型的路径覆盖的模型。因此,题目实际上就是要求最小路径覆盖数。
我们把图中的每个顶点拆成两个顶点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即为问题的解。
[解题心得]
这道题并不难,但是如果对于图论的模型不熟悉的话,未必能够很快得到有效的算法。因此,我们应当熟练掌握各种基本算法,才能在解题过程中加以灵活应用。另外,对于现成的算法,我们也应当尽力优化,力求用简洁高效的代码来实现。
|