POJ 2253贪心算法:
假设集合 U 表示 已经访问过的石头的索引,集合 V 表示未访问过的石头的索引, 全集为 E。起点为 0,目的点为1。
石头数目为 nStoneNum;
贪心算法的描述:
U 初始化为只有一个元素 0,V = E – U。
float aMinDist[nStoneNum]; //记录V中元素与U中元素的最短距离,初始为 U中的各个元素到 A点的距离。
float fMaxRange = 0;
for()
{
从V中找到元素 m, 使 m 与 n(n 属于 U)的距离最小,设这个最小距离为 fMinDist;
if(fMaxRange < fMinDist) fMaxRange = fMinDist;
将m 从集合V中删除,加入到集合U中;
if(m == 1)
break;
for(n属于V)
{
如果 n 到 m 的距离 fDist < aMinDist[n], 那么 aMinDist[n] = fDist;
}
}
fMaxRange即为所求,输出fMaxRange。
用反证法可以证明 fMaxRange 就是题目要求的值。
这道题的算法和Prim求最小生成树的算法很相似,不同的是需要从起点开始访问,不必访问到所有的点,只要访问到终点就可以结束了,在访问过程中记录下从起点到终点过程中的最大跳(fMaxRange),可以说是Prim算法的一部分。其实,Prim算法本身也是贪心算法的一种。Discass里面很多人说用Dijkstra算法,虽然Dijkstra算法也是贪心算法的一种,但我觉得直接用Dijkstra不成立。