深度优先DFS
DFS的执行类似于二叉树的前序遍历,从指定位置开始,对图中顶点纵向访问,该过程的实现使用递归。
基本思路
算法过程:从某顶点出发,访问起点(标记访问并进行相关操作),之后通过递归完成对该点未被访问的邻接点的遍历,直到图中所有顶点均被访问过为止。
代码实现
以邻接矩阵的遍历为例,对图进行dfs(在本例中,相关操作为输出图中顶点的数据)
其中edge为邻接矩阵,vis为标记访问数组。
void MGraph::dfs(int v){
cout<<vertx[v];vis[v]=1;
//访问起点,并标记
for(int i=0;i<vertxNum;i++)
{
if(edge[v][i]==1 && vis[i]==0) dfs(i);
//从当前点开始遍历未被访问的邻接点
}
}
广度优先BFS
BFS的执行类似于二叉树遍历中的层序,对图中的顶点横向展开访问,该功能需要队列实现。
基本思路
1.建队列
2.访问起点,并将起点入队
3.队首元素出队,之后遍历队首元素未被访问的邻接点
代码实现
以邻接矩阵的bfs遍历为例,其中edge为邻接矩阵,vis为标记访问数组。
void MGraph::bfs(int v){
//1.建队列
int rear,front,Q[MaxSize];
front=rear=-1;
//2.访问起点,并入队
int i,k;
cout<<vertx[v];vis[v]=1;Q[++rear]=v;
while( rear != front ){
//3.队头出队,之后遍历邻接点
k=Q[++front];
for(i=0;i<vertxNum;i++){
if( edge[k][i]==1 && vis[i]==0 ) {
cout<<vertx[i];vis[i]=1;Q[++rear]=i;
}
}
}
}