广度优先搜索BFS
1.建立一个空队列
2.从某一结点开始进行访问 将访问的结点入队
3.该结点出队,检测该节点所有邻接点,若该邻接点未被访问则访问入队
4. 循环直到队列为空
注:考虑图不是连通图所以要对所有连通分量进行BFS
bool visited[MAx_VERTEX_NUM]; //访问标记数组
void BFSTraverse(Graph G){
//对图G进行广度优先遍历,设访问函数为xisit()
for(i=0;i<G.vexnum;++i)
visit[i] = false; //访问标记数组初始化
InitQueue(Q) ; //初始化辅助队列Q
for(i=0;i<G.vexnum;++i) //从0号顶点开始遍历
if(!visit[i]) //对每个连通分量调用一次BFS
BFS(G,i); //vi未访问过,从vi开始BFS
}
void BFS(Graph G,int v)
{ //从顶点出发,广度优先遍历图G,算法借助一个辅助队列Q
visit(v); //访问初始顶点v
visited[v] = true; //对v做已访问标记
Enqueue(Q,v); //顶点v入队列
while(!Empty(Q)){
DeQueue(Q,v); //顶点v出队
for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w))//检测v所有的邻接点
if(!visit(w)) //如果w没有被访问过
{
visit(w); //访问w
visit[w] =true; //标记w被访问
Enqueue(Q,w); //顶点w入队
}
}
}
空间复杂度为O(|V|)
时间复杂度 邻接矩阵 =O(|V|的平方)
邻接表 =O(|V|+|E|)
深度优先搜索 DFS
bool visited[MAX_VERTEX_NUM]; //访问标记数组
void DFSTraverse(Graph G){
for(v=0;v<G;v++)
visit[v] = false;
for(v=0;v<G.vexnum;v++)
if(!visited(v)) DFS(G,v);
}
void DFS(Graph G,int v)
{
visit(v);
visited[v] = true;
for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w)){
if(!visited[w]){
DFS(G,w); }
}
}
空间复杂度 O|V|
时间复杂度 邻接矩阵 O|V|的平方
邻接表 O(|V|+O|E|)