图的广度优先遍历
- 任务要求
- 评论
- 关卡排行榜
- 本题代码
任务描述
本关任务:对邻接表存储的无向图进行广度优先遍历。
相关知识
1.无向图的邻接表 2.图的广度优先遍历
编程要求
根据提示,在右侧编辑器补充代码,利用队列的基本算法(如初始化空队列、入队列、出队列、判队空等),实现对邻接表存储的无向图进行广度优先遍历。
输入说明
第1行:输入顶点数n和边数m 第2行:输入n个顶点的名称(字符) 接下来m行,分别输入每条无向边(u,v)
输出说明
1.图的邻接表(每个顶点邻接到的顶点) 2.图的广度优先遍历序列(按顶点编号从小到大选择起点进行遍历,若图连通,则输出一行;若图不连通,则分行输出各连通分支的遍历序列。注意:每个字符前有一个空格)
样例输入
5 4
A B C D E
A C
A B
B C
D E
样例输出
A邻接到: B C
B邻接到: C A
C邻接到: B A
D邻接到: E
E邻接到: D
图的广度优先序列:
A B C
D E
本题代码部分
#include <cstdio>
#include <iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int Status;
#include "queue.h" //循环队列的定义以及基本算法(初始化、入队、出队、判队空)
#include "graph.h" //图的邻接表定义、无向图邻接表的建立和输出
bool visited[MVNum]; //定义访问标记数组
void BFS(ALGraph G,int v)
{ //从顶点v出发,对图进行广度优先遍历
SqQueue Q; //定义队列Q
InitQueue(Q); //将队列Q初始化为空队列
/******************begin*****************/
EnQueue(Q, v); //顶点v入队
visited[v] = true; //标记顶点v为已访问
while (!QueueEmpty(Q))
{
DeQueue(Q, v); //队头元素出队,存储在v中
cout <<" "<<G.vertices[v].data; //输出或其他操作
for (ArcNode* p = G.vertices[v].firstarc; p != NULL; p = p->nextarc)
{
int w = p->adjvex; //邻接顶点的下标
if (!visited[w])
{
EnQueue(Q, w); //邻接顶点入队
visited[w] = true; //标记邻接顶点为已访问
}
}
}
/******************end******************/
}//BFS
void BFSTraverse(ALGraph G){
int v;
for (v=0;v<G.vexnum;v++) //初始化每个顶点的访问标记为false
visited[v]=false;
for (v=0;v<G.vexnum;v++)
{
if (!visited[v])
{
cout<<endl;
BFS(G,v); //对未访问的顶点v,调用BFS,进行广度优先搜索
}
}
}//BFSTraverse
int main()
{ ALGraph G;
CreateUDG(G); //建立无向图的邻接表
PrintGraph(G); //输出图的邻接表
cout<<"\n 图的广度优先序列:";
BFSTraverse(G); //广度优先遍历
return 0;
}