图的广度优先搜索

图的广度优先搜索

示例图结构

IMG_20201127_095521

广度优先搜索类比树的层序遍历,利用队列来实现,第一次进入第一个节点,其后每次出队一个节点就进入这个顶点的全部邻接点,然后为了防止出现死循环,利用一个节点访问数组来存储访问信息。

#include<iostream>
#define MAX_NUM 100
#define MAX_INT 32767
using namespace std;
typedef struct {
	int arc[MAX_NUM][MAX_NUM];
	char vex[MAX_NUM];
	int arcnum,vexnum;
} AMGraph;
typedef struct {
	int *v;
	int front;
	int rear;
} queue;
queue Q;
AMGraph G;
bool visit[MAX_NUM]= {false};
void create_G(AMGraph& G);
void BFS(AMGraph G);
int locatevex(AMGraph& G,char v);
void initqueue(queue& Q);
void enterqueue(queue& Q,char v);
bool emptyqueue(const queue& Q);
char dequeue(queue& Q,int& u);
int main()
{
	create_G(G);
	BFS(G);
	return 0;
}
char dequeue(queue& Q,int& u)
{
	u=Q.v[Q.front];
	Q.front++;
	return u;
}
bool emptyqueue(const queue& Q)
{
	if(Q.front==Q.rear)
		return true;
	else
		return false;
}
void enterqueue(queue& Q,int v)
{
	Q.v[Q.rear]=v;
	Q.rear++;
}
void initqueue(queue& Q)
{
	Q.v=new int[MAX_INT];
	Q.front=Q.rear=0;
}
int locatevex(AMGraph& G,char v)
{
	for(int i=0; i<G.vexnum; i++) {
		if(G.vex[i]==v)
			return i;
	}
	return -1;
}
void BFS(AMGraph G)
{
	int v = 0;
	int u = 0;
	initqueue(Q);
	for (v = 0; v < G.vexnum; v++)
	{
		if (!visit[v])
		{
			cout << G.vex[v]<<" ";
			visit[v] = true;
			enterqueue(Q, v);
			while (Q.front != Q.rear)
			{
				dequeue(Q, u);
				for (int w = 0; w < G.vexnum; w++)
				{
					if ((G.arc[u][w] != MAX_INT) && (visit[w] != true))
					{
						visit[w] = true;
						cout << G.vex[w] << " ";
						enterqueue(Q, w);
					}
				}
			}
		}
	}
	cout << endl;
}
void create_G(AMGraph& G)
{
	char v1,v2;
	int w;
	cin>>G.vexnum>>G.arcnum;//总顶点数,总边数
	for(int i=0; i<G.vexnum; i++) {
		cin>>G.vex[i];
	}
	for(int i=0; i<G.vexnum; i++) {
		for(int j=0; j<G.vexnum; j++) {
			G.arc[i][j]=MAX_INT;
		}
	}
	int i,j;
	for(int k=0; k<G.vexnum; k++) {
		cin>>v1>>v2>>w;
		i=locatevex(G,v1);
		j=locatevex(G,v2);
		G.arc[i][j]=w;
		G.arc[j][i]=G.arc[i][j];
	}
}

注意队列操作,以及访问多少次节点数组和判断是否满足入队条件

image-20201127102302224

运行结果如下:

a\Roaming\Typora\typora-user-images\image-20201127102302224.png" alt=“image-20201127102302224” style=“zoom:50%;” />

运行结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-poFdoyDB-1607695647270)(C:\Users\GHB\AppData\Roaming\Typora\typora-user-images\image-20201127102402132.png)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值