bfs广度优先搜索
来源:互联网 发布:mac运行速度变慢 编辑:程序博客网 时间:2024/05/21 10:28
这一课我们来学习图的另一种遍历方法——广度优先搜索(Breadth-First-Search,简称 BFS)。这是一种连通图的常用遍历策略,通常用于求起点到各点的最短路径,以及求两点之间的最优路径等问题。首先我们先来看看广度优先搜索的具体方法吧:
对于一个连通图,我们假设一开始所有顶点均未被访问,广度优先搜索的主要操作如下:
1 选择图中任意一个顶点 v 作为起点进行访问,并将顶点 v 标为已访问。2 遍历并访问与顶点 v 相邻且未被访问的所有顶点 c1,c2 , …, ck
;接着遍历并访问与顶点 c1,c2 , …, ck
相邻且未被访问的顶点——也就是依次访问所有相邻顶点的相邻顶点;以此类推,直到所有顶点均被访问。
对于算法的具体实现,结合队列先进先出的特性,我们可以借助队列这一数据结构来实现广度优先搜索:
1 任意选择一个顶点 v 作为起点,加入队列;2 访问队首元素 v 并标记,将其从队列中删除;3 遍历与顶点 v 相邻且未被访问的所有顶点 c1,c2 , …, ck
,并依次加入到队列中;
4 重复第二步和第三步操作,直到队列为空。
#include <iostream>#include <vector>#include <cstring>#include <queue>using namespace std;class Graph {private: int n; bool *visited; vector<int> *edges;public: Graph(int input_n) { n = input_n; edges = new vector<int>[n]; visited = new bool[n]; memset(visited, 0, n); } ~Graph() { delete[] edges; delete[] visited; } void insert(int x, int y) { edges[x].push_back(y); edges[y].push_back(x); } void bfs(int start_vertex) { queue<int> bfs_queue; bfs_queue.push(start_vertex); visited[start_vertex]=true; while(!bfs_queue.empty()){ int vertex=bfs_queue.front(); cout<<vertex<<endl; bfs_queue.pop(); for(int adj_vertex:edges[vertex]){ if(!visited[adj_vertex]){ visited[adj_vertex]=true; bfs_queue.push(adj_vertex); } } } }};int main() { int n, m, k; cin >> n >> m; Graph g(n); for (int i = 0; i < m; ++i) { int x, y; cin >> x >> y; g.insert(x, y); } cin >> k; g.bfs(k); return 0;}
0 0
- 广度优先搜索-BFS
- BFS广度优先搜索
- 广度优先搜索 BFS
- 广度优先搜索(BFS)
- 广度优先搜索(BFS)
- 广度优先搜索(BFS)
- BFS (广度优先搜索)
- BFS广度优先搜索
- 广度优先搜索(BFS)
- bfs 广度优先搜索
- bfs广度优先搜索
- 广度优先搜索bfs
- BFS广度优先搜索
- 广度优先搜索(BFS)
- 广度优先搜索 BFS
- 广度优先搜索--BFS
- BFS广度优先搜索
- 广度优先搜索(BFS)
- 初级版迷宫问题(栈的应用)
- [c语言]单链表的实现
- 约瑟夫环
- 找链表的中间结点和倒数第k个结点(链表笔试题面试题)
- 刷刷笔试题~(4)编程
- bfs广度优先搜索
- SICP 练习1.7
- 解析出一个网页中所有的图片
- 关于JAVA中使用nbtstat获取地址报错
- PyQt5:将窗口放在屏幕中间(6)
- Retrofit实现App更新
- HDU1195 BFS或者DP
- CSS盒子模型各属性层级及基础知识
- OpenCV Python 直方图