理论原理:
代码实现:
#include <iostream>
#include <queue>
using namespace std;
#define N 5
struct Graph
{
//顶点信息 1,2,3,...
char vertex[N];
//边信息
int edg[N][N];
};
//将所有点都初始化为未访问
static bool visited[N]={false};
//访问顶点函数
void visit(Graph graph,int index)
{
visited[index]=true;
cout<<graph.vertex[index]<<" ";
}
//连通图,广度优先遍历
void BFS_Connect(Graph graph,int index)
{
//首先访问起始点
visit(graph,index);
queue<int> q;
q.push(index);
//只要栈不空,就一直循环访问下去
while (!q.empty())
{
int v=q.front();
q.pop();
for(int i=0;i<N;i++)
{
//如果连接这个顶点的边存在,且未被访问,则将其先访问再入栈
if(graph.edg[index][i]==1 && visited[i]==0)
{
visit(graph,i);
q.push(i);
}
}
}
}
//非连通图广度优先遍历
void BFS(Graph graph,int index)
{
//确保是先从传入的起点开始遍历
BFS_Connect(graph,index);
for(int i=0;i<N;i++)
{
if(visited[i]==0)
{
BFS_Connect(graph,i);
}
}
}
int main()
{
//初始化图
Graph graph = {
{'1','2','3','4','5'},
{
{0,1,1,1,0},
{1,0,0,1,1},
{1,0,0,0,1},
{1,1,0,0,1},
{0,1,1,1,0},
}
};
BFS(graph,3);
return 0;
}
运行结果: