bfs(无向图)

广度优先搜索:首先以一个未被访问过的顶点作为起始顶点,访问其所有相邻的顶点,然后对每个相邻的顶点,再访问它们相邻的未被访问过的顶点,直到所有顶点都被访问过。

在这里插入图片描述
在邻接矩阵中的存储:
在这里插入图片描述
代码实现:

#include "stdio.h"
int main()
{
	int i,j,m,n,a,b,cur,book[101] = {0},e[101][101];
	int que[10001],head,tail;
	scanf("%d %d",&n,&m);
	//初始化二维矩阵
 	for(i = 1; i <= n; i++) 
    for(j = 1;j <= n; j++)
    if(i == j) e[i][j] = 0;
    else e[i][j] = 99999999;  //假设为正无穷
	
	//读入顶点之间的边
	for(i = 1; i<=m; i++)
	{
		scanf("%d %d",&a,&b);
		e[a][b] = 1;
		e[b][a] = 1; //无向图
		 
	 } 
	 //队列初始化
	 head = 1;
	 tail = 1;
	 
	 //从1号顶点出发,将1号顶点加入队列 
	 que[tail] = 1;
	 tail++;
	 book[1] = 1; //标记已被访问
	 
	 //当队列不为空
	 while(head < tail && tail <= n)
	 {
	 	cur = que[head]; //当前正在访问的顶点编号 
	 	for(i = 1; i <= n; i++) //依次访问每一个顶点 
	 	{
	 		
	 		if(e[cur][i] == 1 && book[i] == 0)
			 {
			 	//从第一个出发并将其入队 
			 	que[tail] = i;
			 	tail ++;
			 	book[i] = 1;//标记顶点i已被访问 
				 
			  } 
			  //如果tail大于n,则表明所有顶点都已经被访问
			  if(tail > n)
			  {
			  	break;
			   } 
			   
		 }
		 head++; //下一个 
	  } 
	  for(i=1;i<tail;i++)
	  printf("%d ",que[i]);
	  getchar(); 
	  getchar(); 
	  return 0;
	  
 } 

效果图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值