请写一个bfs的C++模板
时间: 2024-12-04 14:25:36 浏览: 8
在C++中,我们可以使用模板来创建一个通用的广度优先搜索(BFS)算法,这样就可以应用于不同类型的数据结构,如邻接矩阵或邻接表表示的图。下面是一个简单的BFS模板示例,用于无向图:
```cpp
#include <iostream>
#include <queue>
#include <vector>
template <typename Graph, typename Node = int, typename Edge = std::pair<Node, Node>>
void bfs(const Graph& graph, Node start) {
std::vector<bool> visited(graph.size(), false);
std::queue<Node> queue;
queue.push(start);
while (!queue.empty()) {
Node current = queue.front();
queue.pop();
std::cout << "Visiting node: " << current << "\n";
visited[current] = true;
// 获取当前节点的所有邻居并加入队列
for (const auto& neighbor : graph[current]) {
if (!visited[neighbor]) {
queue.push(neighbor);
}
}
}
}
// 使用示例:假设我们有一个邻接列表表示的图
typedef std::vector<std::vector<Node>> ListGraph; // 使用std::pair作为边的表示
int main() {
ListGraph graph{{1, 2}, {1, 3}, {3, 4}};
bfs<ListGraph>(graph, 1); // 从节点1开始做BFS
return 0;
}
```
在这个模板中,`Graph`是用户自定义的表示图数据结构的模板参数,`Node`和`Edge`分别代表节点类型和边类型。在`bfs`函数中,我们使用`visited`数组跟踪已访问的节点,并用`queue`进行广度优先的遍历。
阅读全文