Vol.26 No.1新乡学院学报(自然科学版)
JournalofXinxiangUniversity(NaturalScienceEdition)2009年2月Feb.2009
基于STL的图遍历问题的解决
炎士涛,郭晓娟,王全蕊
(河南科技学院信息工程学院,河南新乡453000)
*
摘 要:讨论了对图的遍历问题的解决方法,解决图的遍历问题的最终目的在于通过遍历得到点之间的最短距离,这就需要对遍历中经过的节点权值进行比较,遍历所有途径得到最优结果。关键词:广度优先搜索;深度优先搜索;STL中图分类号:TP311
文献标志码:A 文章编号:1674-3326(2009)01-0050-02
SolvingProblemofTraversingGraphBasedonSTL
YANSh-itao,GUOXiao-juan,WANGQuan-rui
(CollegeofInformationEngineering,HenanInstituteofScienceandTechnology,
Xinxiang453000,China)
Abstract:Thediscussionontheissueofthetraversinggraphsettlementisdesignedtogettheshortestdistancebetweenpointsthroughaccessingallpoints,weneedtocompareallthenodevalueandtraverseallchannelstogettheoptimalresults.
Keywords:Depth-firstsearch;Breadth-firstsearch;STL(StandardTemplateLibrary)
0引言
图的遍历问题,就是从图中某个顶点出发访遍图中其余顶点,并且使图中的每个顶点仅被访问一
次的过程。遍历图的过程实质上是通过边或弧对每个顶点查找其邻接点的过程,主要使用广度优先搜索和深度优先搜索结合的方法,两者不同之处在于对顶点访问的顺序不同。STL(标准模板库)[1]是C++标准库的最重要组成部分,是一个包罗算法和数据结构的软件框架,其提供的数据结构和算法对解决这类问题非常方便。
set dfsNode1,dfsNode2;typedefstruct{intx;inty;intmdistance;}NODE;NODEnewnode,oldnode。1.2广度优先算法求出所有宝藏间距离 使用二维数组表示/寻找宝藏0问题的迷宫的通路,在有宝藏的位置标记到达该点时获取的体力值。传入参数为起点和终点的坐标值,通过算法能够求出此两点间的最小距离。在算法中使用VECTOR [2] 数据结构作为队列,其存放数据为结构 体,包含一个位置的X,Y坐标以及到达该位置的距离。所以,将入口坐标、N个宝藏的坐标以及出口的坐标依次作为参数调用BFS过程,就可以得到各个宝藏、入口、出口之间的最小距离。在此过程中可以做一个判断,如果2个宝藏之间没有可通的路,即调用BFS时,不能得到距离值,就说明不能到达所有宝藏且走出迷宫,输出提示信息,结束程序。具体过程是:1)初始化临时二维数组S1,可通过的位置赋 1算法设计 下面将介绍解决问题的方法,采用VisualC ++平台编译和C++语言实现。1.1数据结构的构造 广度优先算法中使用的节点结构体包括节点的坐标X,Y和到达该节点的距离。 typedefstruct{intmsortNumber;intmbodyEnergy; * 收稿日期:2008-12-26 修回日期:2009-01-17 作者简介:炎士涛(1977)),男,河南新乡人。讲师,硕士,研究方向:遗传算法。E-mail:jackyseven1@163.com。 #50#值为1,有宝藏位置赋值为到达该节点的体力值,不可通过的位置初始化为0,初始化标志变量P为false。2)定义一个结构体变量OLDNODE,其X,Y值为传入起点位置参数的坐标,并将其距离初始化为0,将此节点加入队列。3)循环判断队列是否为空,如不空,取队首节点赋值给结构体变量NEWNODE,判断此节点的X,Y坐标是否等于传入的终点位置坐标,如相等,结束循环,并将标志变量P赋值为true。如不相等,根据该节点的X,Y坐标依次向右、上、左、下四个方向的下一个位置探索是否可通(即此位置是否为0)。4)如可通,将此位置的坐标赋值给OLDNODE,并将OLDNODE的距离值赋值为NEWNODE的距离值加1,将OLDNODE加入队列。5)如不可通,转3)。6)如标志变量P的值为false,说明传入的两点之间不可达,输出提示信息,结束。如果P的值为true,说明两点之间存在通路,并返回两点之间的最短距离。 1.3用深度优先算法求出所有宝藏间距离 在得到所有宝藏之间距离的基础上,利用深度优先遍历,参数为入口点的位置标记、初始体力值和记录N个宝藏位置标记的集合。在遍历的过程中,到某宝藏时计算此时所剩的体力值,同时检查是否访问到所有的宝藏,还要注意避免对该宝藏位置重复计算,因为第二次到达该位置时应该按一条通路来看待。根据是否达到终点结束程序,同时返回最大体力值。 伪代码描述如下:voiddfs(intsortNum,intlife,set 依次访问setFindedQueue中的所有节点,判断每个节点是否在该出栈节点的遍历宝藏集合中,如不在,生成新节点,此节点入栈。endif};end(算法结束)。算法中应注意宝藏不能捡2次,当第2次经过 宝藏的时候应该把它作为一条通路来看,而不应该是再捡一次。如果走到一个宝藏时体力值刚好为零,应该作为还可以再走,因为走到这个宝藏处可以获 得一定的体力值。当走出迷宫时体力值刚好为零,应该输出零,而不该输入不能走出迷宫。 主程序伪代码如下:begin(算法开始);打开输入文件input.txt,读入数据,初始化变量;初始化nx,ny存放入口,出口,各宝藏的坐标值;for(i=入口位置到第N个宝藏位置);for(j=第一个宝藏位置到出口位置);g[i][j]=BFS(nx[i],ny[i],nx[j],ny[j]);endfor;endfor;初始化集合et存放宝藏位置标记;调用DFS深度优先遍历;if(DFS返回最大体力值为负);输出提示信息到输出文件,结束。 else;将最大体力值输出到文件;endif;关闭文件;end(算法结束) 2结束语 解决这个问题的关键在于在算法中引用了STL中的数据结构和算法。在传统的解决方法中,此类问题也能得到解决,但很明显,由于在STL中内置了很多针对不同数据结构效率极佳的操作算法,执行起来非常的方便、快捷。在深度和广度优先搜索中递归[3]方法的使用,简化了对复杂相似问题的求解过程。如果用非递归算法会非常冗长,而且最终也必须使用堆栈[4]进行模拟递归。用递归的方法实现的程序代码往往比较简单,但是运行效率却不是很高,这是一个值得注意的问题。在这里当然能用STL之外的数据结构和算法同样实现图的遍历问题,效率也不是特别低。参考文献 [1]侯捷.STL源码剖析[M]1武汉:华中科技大学出版社, 2002:201. [2]候捷.C++标准程序库[M].武汉:华中科技大学出版 社,2002:72. [3]SHTERNV.C++精髓软件工程方法[M].李师贤,译. 北京:机械工业出版社,2002:158. [4]苏仕华.数据结构与算法解析[M].合肥:中国科学技术 大学出版社,2006:62. =责任编辑 王云鹏> #51# 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- xiaozhentang.com 版权所有 湘ICP备2023022495号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务