图的广度优先搜索
广度优先搜索思想(BFS)
首先以一个未被访问过的顶点作为起始顶点,访问其所有相邻的顶点,然后对每个相邻的顶点再访问它们相邻的未被访问的顶点,直到所有顶点都被访问过,遍历结束。
步骤详解
数据结构描述
以图的邻接矩阵描述图,在BFS遍历过程中,借助额外辅助空间队列,队首元素表示正在访问的元素u,队列中的元素为节点u的相邻节点。book数组标记节点i是否被遍历过。
具体过程如下:
实现
#include <vector>
#include <iostream>
#include <queue>
using namespace std;
class BFS_Traverse
{
private:
int vertice = 0;//顶点数
int edge = 0;//边数
vector<vector<int>> e;
vector<bool> book;//判断顶点j是否扩展过
queue<int> qu;
public:
BFS_Traverse(int x, int y) :vertice(x), edge(y)
{
//图的初始化从下标1开始
e.resize(vertice + 1);//初始化二维数组的行
for (int i = 0; i <= vertice; i++)
{
e[i].resize(vertice + 1);//初始化二维数组的列
}
book.resize(vertice + 1);
}
//图的初始化
void Init_tu()
{
for (int i = 0; i <= vertice; i++)
{
for (int j = 0; j <= vertice; j++)
{
if (i == 0 || j == 0)
{
e[i][j] = 0;
}
if (i == j)
{
e[i][j] = 0;
}
else
{
e[i][j] = INT_MAX;
}
}
book[i] = false;
}
book[1] = true;
}
//读入图的边,并且根据边的信息初始化数组dis,数组book
void GetEdgeInfo()
{
cout << "输入边的信息(节点1,节点2,权重):" << endl;
int e1 = 0, e2 = 0, weigth = 0;
for (int i = 1; i <= edge; i++)
{
cin >> e1 >> e2 >> weigth;
e[e1][e2] = weigth;
}
}
//打印
void Print()
{
for (int i = 1; i <= vertice; i++)
{
for (int j = 1; j <= vertice; j++)
{
cout << e[i][j] << " ";
}
cout << endl;
}
cout << endl;
}
//bfs核心思想
void bfs_Alg(int current)//current当前所在的节点编号
{
qu.push(current);
while(!qu.empty())
{
int v = qu.front();
qu.pop();
book[v] = true;
cout << v << "->";
for (int i = 1; i <= vertice; i++)//循坏找节点v的相邻节点
{
if (e[v][i] != INT_MAX && v != i && book[i] == false)
{
qu.push(i);
book[i] = true;
}
}
}
cout << "end" << endl;
}
};
int main()
{
BFS_Traverse bfs(5, 8);
bfs.Init_tu();
bfs.GetEdgeInfo();
cout << "初始信息:" << endl;
bfs.Print();
bfs.bfs_Alg(1);
return 0;
}