[2008-07-24 18:09]贪心(POJ 2253)

 

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不成立。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值