基于邻接矩阵的广度优先搜索遍历
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # include <stdio.h> 2 # include <string.h> 3 int map[100][100],vist[100]; 4 int q[100]; //优先队列存储临时值。 5 int n,m,t,flag; 6 void BFS(int t) 7 { 8 int front=0,rear=0,j,k; 9 q[rear++]=t; 10 while(front<rear) 11 { 12 k=q[front++]; 13 if(flag) 14 printf(" "); 15 flag++; 16 printf("%d",k); 17 for(j=0;j<n;j++)//这个循环是找所有与k节点相邻接的节点,并将他们入栈。 18 //找完之后返回while意思是从先入栈的邻接点开始继续找邻接点的邻接点。 19 { 20 if(map[k][j]==1 && vist[j]==0)//如果map[k][j]==1的话,就表示k节点和j节点相连。 21 { 22 q[rear++]=j; 23 vist[j]=1; 24 } 25 } 26 } 27 } 28 int main() 29 { 30 int tt,u,v,t; 31 scanf("%d",&tt); 32 while(tt--)//测试数据组数; 33 { 34 memset(vist,0,sizeof(int));//标记数组初始化为0即表示节点没有被访问过; 35 memset(map,0,sizeof(int));//邻接矩阵初始化,两节点间有边相连为1无边相连为0; 36 scanf("%d %d %d",&n,&m,&t);//输入节点数n,边数m,初始遍历节点t; 37 for(int i=0;i<m;i++)//把所有边的信息存储; 38 { 39 scanf("%d%d",&u,&v); 40 map[u][v]=map[v][u]=1; 41 } 42 flag=0;//标记变量,用于输出“ ”; 43 vist[t]=1;//从起始遍历点开始遍历,并将vist[]数组值改为1; 44 BFS(t);//(利用优先队列)调用函数; 45 printf("\n"); 46 } 47 return 0; 48 }