一、图的基本操作
二、图的广度优先遍历
2.1 算法思想:
与二叉树的层序遍历相比较:
树的层序遍历和图的广度优先遍历区别在于:
树中不存在回路,搜索相邻的结点时,不可能搜到已经访问过的结点
在图中搜索相邻的顶点时,有可能搜到已经访问过的结点
改进方法:
设置一个访问标记数组 visited[]
相关函数接口:
2.2 代码实现:
//图的广度优先遍历
bool visited[MAX_VERTEX_NUM];//访问标记数组
void BFS(Graph G,int v){ //从顶点v出发,广度优先遍历图G
visit(v); //访问初始顶点v
visited[v]=true; //对v做已访问标记
EnQueue(Q,v); //顶点v入队列Q
while(!IsEmpty(Q)){
DeQueue(Q,v); //队头元素出队
//检测队头元素v的所有邻接点
//w是v的第一个邻接点
for(w=FirstAdjVertex(G,v);w!=-1;w=NextAdjVertex(G,v,w)) {
if(!visited[w]){ //w为v尚未访问过的邻接顶点
visit(w);
visited[w]=true;
EnQueue(Q,w);
}
}
}
}
存在问题:
如果是非连通图,则无法遍历完所有结点
算法改进:
//完整的广度优先遍历
void BFSTraverse(Graph G){ //对图G进行广度优先遍历
for(int i=0;i<G.vexnum;i++){
visited[i]=false;
}
for(int i=0;i<G.vexnum;i++){
if(!visited[i])
BFS(G,i);
}
}
2.3 复杂度分析:
时间复杂度:
1、访问顶点
2、找各条边
邻接矩阵存储的图:
邻接表存储的图:
2.4 广度优先生成树:
根据广度优先遍历序列来画出来的树:
广度优先生成树不唯一
2.5 遍历序列的可变性:
总结
以上就是今天要讲的内容,本文仅仅简单介绍了图的一种遍历方式,下一节会提供图的深度优先遍历