图的遍历
图的遍历分为广度优先和深度优先,下面我们就来介绍图的两种遍历算法,
一、广度优先
1.1伪代码
1、初始化队列Q
2、将第一个顶点v入队Q,visited[v]=1
3、当队列不为空:
4.1、v=队列Q的第一个元素
4.2、w=v的第一个邻接点
4.3、while(w存在)
4.3.1、if(visited[w]=0)
访问顶点w,并将w入队
4.3.2、w=v的下一个邻接点
1.2源代码
template <class DataType>
void MGraph<DataType>::BFSTraverse(int v)
{
int Q[MaxSize];
int front = -1, rear = -1; //初始化队列,假设队列采用顺序存储且不会发生溢出
cout << vertex[v]; visited[v] = 1; Q[++rear] = v; //被访问顶点入队
while (front != rear) //当队列非空时
{
v = Q[++front]; //将队头元素出队并送到v中
for (int j = 0; j < vertexNum; j++)
if (arc[v][j] == 1 && visited[j] == 0 ) {
cout << vertex[j];
visited[j] = 1;
Q[++rear] = j;
}
}
}
二、深度优先
2.1、伪代码
1)、访问当前节点v
2)、将visited[v]记为1,表示当前节点已经被访问过
3)、取v的下一个节点为w
4)、当w存在时(也就是v和w是连通的):
4.1)、如果w没有被访问过:
传入参数v,执行1) //采用递归算法
4.2)、取v的下一个节点为w
2.2、C++代码
template <class DataType>
void MGraph<DataType>::DFSTraverse(int v)
{
cout << vertex[v]; visited[v] = 1;
for (int j = 0; j < vertexNum; j++)
if (arc[v][j] == 1 && visited[j]==0)
DFSTraverse(j);
}