广度优先搜索是从顶点出发,先遍历完其所有邻接点,在依次遍历访问过结点的邻接点,像声波扩散;具有先来先服务特性,适合用队列。
算法步骤:
1、建立bool类型访问标记数组,并初始化所有元素为false,代表每个结点都没有被访问;
2、以图中的某个指定结点作为顶点,访问并标记后入队;
3、将队头元素出队,访问其所有邻接点,若未访问则访问并标记后入队,循环操作直到队列为空。
代码实现:
#include <iostream>
using namespace std;
#include <queue>
#define max_vex 50
#define max_edge 100
int n, m, cnt;
int head[max_vex];
int visited[max_vex];
class Edge
{
public:
int to;
int next;
};
Edge edge[max_edge];
void InsertEdge(int u, int v)
{
edge[++cnt].to = v;
edge[cnt].next = head[u];
head[u] = cnt;
}
void CreateG()
{
int u = 0, v = 0;
memset(head, 0, sizeof(head));
cout << "请输入结点数;" << endl;
cin >> n;
cout << "请输入边数:" << endl;
cin >> m;
cout << "请依次输入每个边的两个顶点:" << endl;
for (int i = 1; i <= m; i++)
{
cin >> u >> v;
InsertEdge(u, v);
InsertEdge(v, u);
}
}
void BFS(const int& start_vex)
{
int top_vex = 0;
queue<int> q;
cout << start_vex << " ";
visited[start_vex] = true;
q.push(start_vex);
while (!q.empty())
{
top_vex = q.front();
q.pop();
for (int i = head[top_vex]; i; i = edge[i].next)
{
if (visited[edge[i].to])
{
continue;
}
cout << edge[i].to << " ";
visited[edge[i].to] = true;
q.push(edge[i].to);
}
}
}
int main()
{
int start;
CreateG();
cout << "请输入广搜的出发结点" << endl;
cin >> start;
BFS(start);
return 0;
}