图的深度优先遍历和广度优先遍历
程序员文章站
2022-05-21 19:27:53
...
在前面那篇文章中,只写了关于连通图的广度优先遍历算法和深度优先遍历算法,没有考虑到非连通图的情况
:https://blog.csdn.net/qq_37964547/article/details/80100975
那么现在对之前的代码进行优化,我们可以先来理一下思路:
1、图的广度优先遍历算法
所谓广度,就是一层一层的,向下遍历,层层堵截,
BFS()
{
输入起始点;
初始化所有顶点标记为未遍历;
vector<bool> visit(_v.size(),false);//用来标记已经访问过的
初始化一个队列queue并将起始点放入队列;
_BFS();
for()
{
if(没有被访问)
{
把结点push入队列;
_BFS();
}
}
}
_BFS()
{
while(queue不为空)
{
从队列中删除一个顶点s并标记为已遍历;
将s邻接的所有还没遍历的点加入队列;
}
}
具体代码实现:
void BFS(const V &v)
{
queue<V> index;//用来存放节点的下标
vector<bool> visit(_v.size(),false);//用来标记已经访问过的
int srcIdx = GetIndexOfV(v);
index.push(srcIdx);
_BFS(index, visit);
for (int i = 0; i < _v.size(); i++)
{
if (visit[i]==false)
{
index.push(i);
_BFS(index,visit);
}
}
}
void _BFS(queue<V>&index,vector<bool>&visit)
{
while (!index.empty())
{
int front = index.front();
index.pop();
Linkedge* pCur = _edges[front];
if (visit[front] == true)//说明已经访问过了
continue;
cout << (char)_v[front] << "-->";
visit[front] = true;
//Linkedge* pCur = _edges[front];
while (pCur)
{
index.push(pCur->_dst);
pCur = pCur->_pNext;
}
}
}
2、深度优先遍历算法
DFS()
{
建立一个vector数组visited并初始化成false;
获取给出节点的下标
_DFS(visited,index);
for()
{
if(没有被访问)
_DFS();
}
}
DFS(顶点v)
{
标记v为已遍历;
for(对于每一个邻接v且未标记遍历的点u)
DFS(u);
}
具体代码实现:
void DFS(const V& v)
{
vector<bool> visited(_v.size(),false);
int srcIdx = GetIndexOfV(v);
//cout << _v[srcIdx] << "-->";
_DFS(visited, srcIdx);
for (size_t i = 0; i < _v.size(); i++)
{
if (visited[i] == false)
_DFS(visited, i);
}
}
void _DFS(vector<bool>&visited, int srcIdx)
{
//int srcIdx = GetIndexOfV(v);
cout << (char)_v[srcIdx] << "-->";
visited[srcIdx] = true;//将第一个节点标记为true
Linkedge* pCur = _edges[srcIdx];
while (pCur)
{
if (visited[pCur->_dst] == false)
_DFS(visited, pCur->_dst);//类似于访问子图
pCur = pCur->_pNext;
}
}
这就是图的两种遍历算法。