| 发表于:2007-09-17 11:03:477楼 得分:10 |
将未遍历的点放在集合 a 中,将已遍历的有序点(路径)放在数组(或链表之类的结构)b 中;函数 d((x1,y1),(x2,y2)) 表示两点直接的距离。 初时化:a{所以100000个点},b{仅原点 (0,0)}。 第一步:从 a 中找出一个点 p1(x1,y1),与原点之间的距离 d((x1,y1),(0,0)) 最短;将 p1 从 a 中删除,添加到 b 的原点后面。 第二步:从 a 中找出一个点 p2(x2,y2),新增距离 a=d((x2,y2),(x1,y1))+d((x2,y2),(0,0))-d((x1,y1),(0,0)) 或 b=d((x2,y2),(x1,y1)) 最短(注:是所有点中同时考虑 a、b 查找最短);将 p2 从 a 中删除,如果 a < b 那么将 p2 插入到 p1 前面,否则添加到 p2 后面。 ... 第n 步:从 a 中找出一个点 pn(xn,yn),新增距离: 对 b 中任意连续两个点 pi、pj(其中j=i+1),a=d((xn,yn),(xi,yi))+d((xn,yn),(xj,yj))-d((xi,yi),(xj,yj)) 到 b 中最后一个点 pk(其中 k=n-1),b=d((xn,yn),(xk,yk)) 最短(注:是所有点中同时考虑所有 a、b 查找最短);将 pn 从 a 中删除,如果 a < b 那么将 pn 插入到 pj 前面,否则添加到 pk 后面。 ... 一直到 a 为空。 关键是如何对查找点 pn 进行优化。 | | |
|