数据结构之图---广度优先遍历---C++实现

来源:互联网 发布:海贼王887 知乎 编辑:程序博客网 时间:2024/06/07 23:15

一、目标图对其实现广度优先遍



二、实现深度优先遍历

1、结点的描述  

2、图的描述

以上描述见上篇:数据结构之图--深度优先遍历---C++实现 :http://blog.csdn.net/wys2011101169/article/details/52238644

//在main.cpp中添加//当我们调用的深度优先后,结点已经设置为访问过了,所以需要重置一下,在调用广度优先遍历cout << endl;pMap->resetNode();pMap->breadthFirstTraverse(0);


三、深度优先遍历的算法分析

算法核心代码
//CMap.cppvoid CMap::breadthFirstTraverse(int nodeIndex){cout << m_pNodeArray[nodeIndex].m_cData << " ";m_pNodeArray[nodeIndex].m_bisVisited = true;vector<int> curVec;curVec.push_back(nodeIndex);breadthFirstTraversalImpl(curVec);}void CMap::breadthFirstTraversalImpl(vector<int> preVec)   //广度优先遍历实现函数{int value = 0;vector<int> curVec;for (int j = 0; j < (int)preVec.size();j++){for (int i = 0; i < m_iCapacity;i++){getValueFromMatrix(preVec[j], i, value);if (value !=0){if (m_pNodeArray[i].m_bisVisited){continue;}else{cout << m_pNodeArray[i].m_cData << " ";m_pNodeArray[i].m_bisVisited = true;curVec.push_back(i);}}}}if (curVec.size() == 0){return;}else{breadthFirstTraversalImpl(curVec);}}

算法思路(以上图为例):一层一层的遍历,以A点出发同时置A已被访问,遍历所有与A点相连接的点(B点,D点)。再将B,D的索引放入curVec中,双重for循环,找与B点相连接所有的点且未被访问(C点,F点),然后找与D点相连接的所有的点且未被访问(G点,H点)。再将(C,F,G,H)放入curVec中,调用深度遍历,调用递归,依次找到与C,F,G,H相连接的所有点且且未被访问,直至最后一层访问完毕,返回。 过程如下图所示:

注:点与点之间的关系根据邻接矩阵可得




0 0