图的广度优先遍历

本文介绍了图的广度优先遍历,与树的宽度优先遍历相似,但需处理环路问题。通过为节点设置状态标记避免重复遍历,白色表示未访问,灰色表示已访问未展开,黑色表示已展开。文章提供了相关代码示例,并给出了从2号顶点到5号顶点的无权最短路径。详细实现可在作者的GitHub项目中查看。
摘要由CSDN通过智能技术生成

图的广度优先遍历与树的宽度优先遍历类似,实现方法也类似。但是相对树,图存在一种特殊情况——环路,环路使得一个已经遍历过的结点,会在其后代结点的子结点中再次被遍历,从而产生多余的读取操作。为了解决这个问题,我们需要为结点设置一个状态以标记其是否已被遍历过。

下面是图和结点及相关定义。

typedef enum VertexColor
{
	Vertex_WHITE = 0,	// 未被搜索到
	Vertex_BLACK = 1,	// 子结点都被搜索完毕
	Vertex_GRAY = 2	// 子结点正在被搜索
} VertexColor;

typedef struct GNode
{
	int number;	// 顶点编号
	struct GNode *next;
} GNode;

typedef struct Vertex
{
	int number;
	VertexColor color;	// 搜索过程标记搜索状态
	struct Vertex *p;
} Vertex;

typedef struct Graph
{
	GNode *LinkTable;
	Vertex *vertex;
	int VertexNum;
} Graph;
上述定义的图用邻接表来表示点和边的关系,每个顶点有编号和颜色两个属性。顶点的p成员变量记录了该顶点的前驱顶点。
下面的代码用队列实现,将同一层的结点放到队列里面,然后每次出队一个结点,展开该结点的下一层孩子结点,并入队,以此类推。


                
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值