📅  最后修改于: 2023-12-03 15:13:39.167000             🧑  作者: Mango
BFS(广度优先搜索)是一个基于队列的算法,用于图形搜索领域。它被用于社交网络中的连通组件、地图渲染、语法分析等多个领域。BFS 从一个根节点开始,将它的所有相邻节点加入队列中。现在,将这些节点全部取出,以相同的方式扩展第二层节点。处理完第二层节点之后,BFS 继续扩展第三层节点,以此类推,直到找到符合要求的节点。
下面给出BFS算法的Python示例代码片段。
from collections import deque
def bfs(graph, root):
visited, queue = set(), deque([root])
visited.add(root)
while queue:
vertex = queue.popleft()
print(str(vertex) + " ", end="")
for neighbour in graph[vertex]:
if neighbour not in visited:
visited.add(neighbour)
queue.append(neighbour)
在下面代码段中,我们创建了一个简单的图形来使用 BFS 函数。我们从节点0开始遍历,然后遍历它的相邻节点。
graph = {0: [1, 2], 1: [2], 2: [3], 3: [1, 2]}
bfs(graph, 0)
下面给出BFS算法的C++示例代码片段。
#include <iostream>
#include <list>
using namespace std;
class Graph {
int numVertices;
list<int> *adjLists;
bool *visited;
public:
Graph(int V);
void addEdge(int src, int dest);
void BFS(int startVertex);
};
Graph::Graph(int vertices) {
numVertices = vertices;
adjLists = new list<int>[vertices];
visited = new bool[vertices];
}
void Graph::addEdge(int src, int dest) {
adjLists[src].push_back(dest);
adjLists[dest].push_back(src);
}
void Graph::BFS(int startVertex) {
for(int i = 0; i < numVertices; i++)
visited[i] = false;
list<int> queue;
visited[startVertex] = true;
queue.push_back(startVertex);
list<int>::iterator i;
while(!queue.empty()) {
int currVertex = queue.front();
cout << "Visited " << currVertex << " ";
queue.pop_front();
for(i = adjLists[currVertex].begin(); i != adjLists[currVertex].end(); ++i) {
int adjVertex = *i;
if(!visited[adjVertex]) {
visited[adjVertex] = true;
queue.push_back(adjVertex);
}
}
}
}
int main() {
Graph g(4);
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(1, 2);
g.addEdge(2, 3);
g.BFS(0);
return 0;
}
在下面代码段中,我们创建了一个简单的图形,如下所示,使用 BFS 函数。我们从节点0开始遍历,然后遍历它的相邻节点。
1 -- 2
/ \
0 3
int main() {
Graph g(4);
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(1, 2);
g.addEdge(2, 3);
g.BFS(0);
return 0;
}
BFS算法是图形搜索中最基本、最常用的算法之一。在实践中,它们通常与其他算法(如深度优先搜索)结合使用,以获得更好的结果。这篇文章提供了Python和C++版本的BFS算法示例,可以为开发者提供启发。