BFS广度优先遍历(C++版)

此代码示例展示了如何使用C++编程实现邻接表结构来对有向图进行广度优先遍历。程序定义了图的结构,包括顶点、边以及相关操作,如初始化队列、入队、出队等,并提供了BFSTraverse函数遍历整个图。此外,提到此代码同样适用于无向图的遍历,只需调整邻接表的构建方式。
摘要由CSDN通过智能技术生成

 

 

代码如下:

#include<iostream>
#define MaxVertexNum 6 //定义图中最大节点的个数
typedef int VertexType;

using namespace std;

bool visited[6];//访问标记数组
typedef struct
{
	VertexType Que[100];
	int front, rear;
}Queue;

bool IsEmpty(Queue Q)
{
	if (Q.front == Q.rear)
	{
		return true;
	}
	else
	{
		return false;
	}
}

void InitQueue(Queue& Q)
{
	Q.front = Q.rear=0;
};

void EnQueue(Queue& Q,int x)
{
	Q.Que[Q.rear++] = x;
}

void DeQueue(Queue& Q)
{
	if (!IsEmpty(Q))
	{
		printf("%d",Q.Que[Q.front++]);
	}

}


//定义单链表节点的结构体
typedef struct ArcNode {           /* 清华教材书上与王道书上都没有具体给出这个结构体究竟想干个啥,
	                                  仅仅说的边表,实际上这里定义每一个单链表中的节点的结构体(邻接表法:图有多少个节点就有多少个单链表)  */
	int adjvex;              //该节点的值,就是与该单链表中顶点相连的节点的值      
	struct ArcNode* next;    //指向单链表的下一个节点
	//InfoType info;
}ArcNode;

//邻接表法还要找一个顶点表,用来存储图的所有节点
typedef struct VNode {
	VertexType data;         //顶点的值
	ArcNode* first;          //顶点相当于单链表的第一个节点,因此取名为first
}VNode,AdjList[MaxVertexNum]; //此处已经解释过,为啥定义为数组形式,就是为了存储100个节点的结构体

//单链表有了,顶点表有了,最后封装起来,定义为图,就大功告成
typedef struct {
	AdjList Vertices;  //这里也解释过了
	int vexnum, arcnum;  //记录整个图的节点个数,记录整个图的边个数
}ALGraphy;              //定义为邻接表形式的图

void BFS(ALGraphy G, int v,Queue &Q)
{
	visited[v] = true;
	EnQueue(Q, v+1);
	while (!IsEmpty(Q))
	{
		DeQueue(Q);
		ArcNode* p = (ArcNode*)malloc(sizeof(ArcNode));
		p = G.Vertices[v].first;
		while (p != NULL)
		{
			if (!visited[p->adjvex - 1])
			{
			    EnQueue(Q, p->adjvex);
				visited[p->adjvex - 1] = true;
			}
			p = p->next;

		}
		v = Q.Que[Q.front]-1;
	}

}


void BFSTraverse(ALGraphy G)
{
	for (int i = 0; i < G.vexnum; i++)
	{
		visited[i] = false;  //初始化未被访问,置为false;
	}
	Queue Q;
	InitQueue(Q);
	for (int i = 0; i < G.vexnum; i++)
	{
		if (!visited[i])
		{
			BFS(G, i,Q);
		}
	}

}



int main()
{
	ALGraphy Graphy;

	//图中有6个节点,8条边,意味着顶点表有6个元素,先循环赋值一波
	Graphy.vexnum = 6;
	Graphy.arcnum = 8;
	for (int i = 0; i < 6; i++)
	{
		Graphy.Vertices[i].data = i + 1;   //先把6个顶点的值装进顶点表中
		Graphy.Vertices[i].first = NULL;   //全部置为空
	}
	//接下来构建每个节点的单链表了
    //先讨论顶点1,它有向指向2与4
	Graphy.Vertices[0].first = (ArcNode*)malloc(sizeof(ArcNode));  //先为顶点1申请空间
	Graphy.Vertices[0].first->adjvex =2;
	Graphy.Vertices[0].first->next = (ArcNode*)malloc(sizeof(ArcNode));
	Graphy.Vertices[0].first->next->adjvex = 4;
	Graphy.Vertices[0].first->next->next = NULL;

	//再讨论顶点2,它有向指向顶点5
	Graphy.Vertices[1].first = (ArcNode*)malloc(sizeof(ArcNode));
	Graphy.Vertices[1].first->adjvex = 5;
	Graphy.Vertices[1].first->next = NULL;

	//讨论顶点3,它有向指向6,5
	Graphy.Vertices[2].first = (ArcNode*)malloc(sizeof(ArcNode));  //先为顶点1申请空间
	Graphy.Vertices[2].first->adjvex = 6;
	Graphy.Vertices[2].first->next = (ArcNode*)malloc(sizeof(ArcNode));
	Graphy.Vertices[2].first->next->adjvex = 5;
	Graphy.Vertices[2].first->next->next = NULL;

	//讨论顶点4,它有向指向顶点2
	Graphy.Vertices[3].first = (ArcNode*)malloc(sizeof(ArcNode));
	Graphy.Vertices[3].first->adjvex = 2;
	Graphy.Vertices[3].first->next = NULL;

	//讨论顶点5,它有向指向顶点4
	Graphy.Vertices[4].first = (ArcNode*)malloc(sizeof(ArcNode));
	Graphy.Vertices[4].first->adjvex = 4;
	Graphy.Vertices[4].first->next = NULL;

	//讨论顶点6,它有向指向顶点6
	Graphy.Vertices[5].first = (ArcNode*)malloc(sizeof(ArcNode));
	Graphy.Vertices[5].first->adjvex = 6;
	Graphy.Vertices[5].first->next = NULL;

	printf("该有向图广度优先遍历的结果为:");
	BFSTraverse(Graphy);



	





}

 

 此代码实现的是邻接表形式的广度优先遍历,这里我画的是有向图,也可以拿来实现无向图的遍历,只用修改图的邻接表就行了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值