基于STL的图遍历问题的解决

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 setFindedQueue;}DFSNODE;DFSNODE

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,setsetFindedQueue);BEGIN(算法开始);根据传入参数sortNum和life生成节点,此时节点代表入口节点,将此节点入栈;w hile(栈不为空){出栈栈顶元素节点;if(此节点已访问宝藏的集合==setFindedQueue);计算该节点达到出口的体力值;if(该体力值>max value)//max value全局变量表示走出时最大体力值;m ax value=该体力值;endif;else。

依次访问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

#

相关文档
最新文档