基于STL的图遍历问题的解决
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第26卷 第1期
V ol.26 N o.1
新乡学院学报(自然科学版)
Journal of Xinx iang U niv ersity (N atural Science Editio n)
2009年2月Feb.2009
基于ST L 的图遍历问题的解决
*
炎士涛,郭晓娟,王全蕊
(河南科技学院信息工程学院,河南新乡453000)
摘 要:讨论了对图的遍历问题的解决方法,解决图的遍历问题的最终目的在于通过遍历得到点之间的最短距离,这就需要对遍历中经过的节点权值进行比较,遍历所有途径得到最优结果。关键词:广度优先搜索;深度优先搜索;ST L 中图分类号:T P311
文献标志码:A 文章编号:1674-3326(2009)01-0050-02
Solving Problem of Traversing Graph Based on STL
Y AN Sh-i tao,GUO Xiao -juan,WANG Quan -rui
(Colleg e o f Informat ion Eng ineering ,H enan Institute of Science and T echnolog y,
X inxiang 453000,China)
Abstract:T he discussio n o n the issue o f the t raver sing g raph settlement is designed to g et the shor test distance betw een points thr ough accessing all points,w e need to co mpar e all the node v alue and tr aver se all channels to g et the o pt imal r esults.
Key words:D epth -fir st sear ch;Br eadth -fir st sea rch;ST L (Standa rd T emplate L ibrar y)
0引言
图的遍历问题,就是从图中某个顶点出发访遍图中其余顶点,并且使图中的每个顶点仅被访问一
次的过程。遍历图的过程实质上是通过边或弧对每个顶点查找其邻接点的过程,主要使用广度优先搜索和深度优先搜索结合的方法,两者不同之处在于对顶点访问的顺序不同。ST L(标准模板库)[1]是C ++标准库的最重要组成部分,是一个包罗算法和数据结构的软件框架,其提供的数据结构和算法对解决这类问题非常方便。
1算法设计
下面将介绍解决问题的方法,采用Visual C
++平台编译和C ++语言实现。1.1数据结构的构造
广度优先算法中使用的节点结构体包括节点的坐标X ,Y 和到达该节点的距离。
typedef struct {int msortNumber;int mbodyEnergy;
set
dfsNode1,dfsNode2;typedef struct {int x ;int y ;int mdistanc e;}NODE;NODE newnode,oldnode 。1.2广度优先算法求出所有宝藏间距离
使用二维数组表示/寻找宝藏0问题的迷宫的通路,在有宝藏的位置标记到达该点时获取的体力值。传入参数为起点和终点的坐标值,通过算法能够求出此两点间的最小距离。在算法中使用VECT OR
[2]
数据结构作为队列,其存放数据为结构
体,包含一个位置的X ,Y 坐标以及到达该位置的距离。所以,将入口坐标、N 个宝藏的坐标以及出口的坐标依次作为参数调用BFS 过程,就可以得到各个宝藏、入口、出口之间的最小距离。在此过程中可以做一个判断,如果2个宝藏之间没有可通的路,即调用BFS 时,不能得到距离值,就说明不能到达所有宝藏且走出迷宫,输出提示信息,结束程序。具体过程是:1)初始化临时二维数组S1,可通过的位置赋
#
50#*
收稿日期:2008-12-26 修回日期:2009-01-17 作者简介:炎士涛(1977)),男,河南新乡人。讲师,硕士,研究方向:遗传算法。E -mail:jacky sev en1@163.co m 。
值为1,有宝藏位置赋值为到达该节点的体力值,不可通过的位置初始化为0,初始化标志变量P为false。2)定义一个结构体变量OLDNODE,其X,Y 值为传入起点位置参数的坐标,并将其距离初始化为0,将此节点加入队列。3)循环判断队列是否为空,如不空,取队首节点赋值给结构体变量NEWNODE,判断此节点的X,Y坐标是否等于传入的终点位置坐标,如相等,结束循环,并将标志变量P赋值为true。如不相等,根据该节点的X,Y坐标依次向右、上、左、下四个方向的下一个位置探索是否可通(即此位置是否为0)。4)如可通,将此位置的坐标赋值给OLDN ODE,并将OLDNODE的距离值赋值为NEWN ODE的距离值加1,将OLDNODE加入队列。5)如不可通,转3)。6)如标志变量P的值为false,说明传入的两点之间不可达,输出提示信息,结束。如果P的值为tr ue,说明两点之间存在通路,并返回两点之间的最短距离。
1.3用深度优先算法求出所有宝藏间距离
在得到所有宝藏之间距离的基础上,利用深度优先遍历,参数为入口点的位置标记、初始体力值和记录N个宝藏位置标记的集合。在遍历的过程中,到某宝藏时计算此时所剩的体力值,同时检查是否访问到所有的宝藏,还要注意避免对该宝藏位置重复计算,因为第二次到达该位置时应该按一条通路来看待。根据是否达到终点结束程序,同时返回最大体力值。
伪代码描述如下:v oid dfs(int sortNum,int life,set
依次访问setFindedQueue中的所有节点,判断每个节点是否在该出栈节点的遍历宝藏集合中,如不在,生成新节点,此节点入栈。endif};end(算法结束)。算法中应注意宝藏不能捡2次,当第2次经过宝藏的时候应该把它作为一条通路来看,而不应该是再捡一次。如果走到一个宝藏时体力值刚好为零,应该作为还可以再走,因为走到这个宝藏处可以获得一定的体力值。当走出迷宫时体力值刚好为零,应该输出零,而不该输入不能走出迷宫。
主程序伪代码如下:begin(算法开始);打开输入文件input.tx t,读入数据,初始化变量;初始化nx,ny存放入口,出口,各宝藏的坐标值;for(i=入口位置到第N个宝藏位置);for(j=第一个宝藏位置到出口位置);g[i][j]=BFS(nx[i],ny[i], nx[j],ny[j]);endfo r;endfo r;初始化集合et存放宝藏位置标记;调用DFS深度优先遍历;if(DFS返回最大体力值为负);输出提示信息到输出文件,结束。
else;将最大体力值输出到文件;endif;关闭文件;end(算法结束)
2结束语
解决这个问题的关键在于在算法中引用了ST L中的数据结构和算法。在传统的解决方法中,此类问题也能得到解决,但很明显,由于在STL中内置了很多针对不同数据结构效率极佳的操作算法,执行起来非常的方便、快捷。在深度和广度优先搜索中递归[3]方法的使用,简化了对复杂相似问题的求解过程。如果用非递归算法会非常冗长,而且最终也必须使用堆栈[4]进行模拟递归。用递归的方法实现的程序代码往往比较简单,但是运行效率却不是很高,这是一个值得注意的问题。在这里当然能用ST L之外的数据结构和算法同样实现图的遍历问题,效率也不是特别低。
参考文献
[1]侯捷.ST L源码剖析[M]1武汉:华中科技大学出版社,
2002:201.
[2]候捷.C++标准程序库[M].武汉:华中科技大学出版
社,2002:72.
[3]SHT ER N V.C++精髓软件工程方法[M].李师贤,译.
北京:机械工业出版社,2002:158.
[4]苏仕华.数据结构与算法解析[M].合肥:中国科学技术
大学出版社,2006:62.
=责任编辑王云鹏>
#
51
#