1.宽度优先遍历无向图
无向图是图论中常见的数据结构,其中边没有方向性,连接两个顶点的边是双向的。宽度优先遍历(Breadth-First Search, BFS)是一种用于遍历或搜索无向图的算法。与深度优先遍历不同,宽度优先遍历从图的某一顶点出发,逐层向外扩展,首先访问所有相邻的顶点,然后再访问这些顶点的未访问过的相邻顶点,以此类推。这种遍历方式在寻找最短路径、检测图的连通性等方面有着广泛的应用。
2.宽度优先遍历的基本原理
宽度优先遍历使用队列这种数据结构来保存待访问的顶点。算法从起始顶点开始,将其加入队列。然后,算法从队列中取出一个顶点,访问它,并将其所有未访问过的相邻顶点加入队列。这个过程一直重复,直到队列为空,即所有可达的顶点都被访问过。
3.宽度优先遍历无向图的步骤
-
初始化:
- 创建一个无向图,表示顶点和边的关系。
- 初始化一个标记数组或集合,用于记录每个顶点的访问状态。所有顶点初始时都标记为未访问。
- 初始化一个队列,用于存储待访问的顶点。
- 选择一个起始顶点作为遍历的起点,并将其加入队列。
-
开始遍历:
- 当队列不为空时,从队列中取出一个顶点,并访问它。
- 标记该顶点为已访问。
- 遍历该顶点的所有相邻顶点。对于每个未访问过的相邻顶点,执行以下操作:
- 将其加入队列。
- 标记为已访问。
- 重复上述步骤,直到队列为空。
-
输出结果:
- 当队列为空时,遍历结束。可以根据需要输出遍历的顺序、最短路径或其他相关信息。
4.宽度优先遍历无向图的代码实现
#include<iostream>
#define MAX 101
using namespace std;
int main(){
int n,m,e[MAX][MAX],que[MAX],book[MAX],cur;
cin>>n>>m;//元素个数和边数
for (int i = 1; i <=n; i++)
for (int j = 1; j <=n; j++)
{
if(i==j)e[i][j]=0;
else e[i][j]=9;
}
int a,b;
for (int i = 1; i <=m; i++){
cin>>a>>b;
e[a][b] = 1;
e[b][a] = 1;
}
//queue
int head=1,tail=1;
que[1]=1;
tail++;
book[1]=1;
while (head<tail&&tail<=n)
{
cur=que[head];
for (int i = 1; i <=n; i++)
{
if(e[cur][i]==1&&book[i]==0)
{
book[i]=1;
que[tail]=i;
tail++;
}
}
if(tail>n)break;
head++;
}
for (int i = 1; i < tail; i++)
{
cout<<que[i]<<" ";
}
return 0;
}
相似写法
#include<iostream>
#define MAX 100
using namespace std;
int main(){
int m,book[MAX+1]={0},n,e[MAX+1][MAX+1];
cout<<"enter total line:";
cin >>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
if(i==j)e[i][j]=0;
else e[i][j]=9;
}
int a,b;
for(int i=1;i<=m;i++){
cin>>a>>b;
e[a][b]=1;
e[b][a]=1;}
int head=1,tail=1;
int que[MAX+1];
que[1]=1;
tail++;
book[1]=1;//
while(head<tail&&tail<=n){
for(int i=1;i<=n;i++){
if (e[que[head]][i]==1&&book[i]==0)//que[head]
{
book[i]=1;
que[tail]=i;
tail++;
}
}
head++;
}
for(int i=1;i<tail;i++)
cout<<que[i]<<" ";
return 0;
}
/* 5 5
1 2
1 3
1 5
2 4
3 5 */
5.注意事项
注意book数组的初始化问题。写法二在出错后才改为book[MAX+1]={0},将错误解决。