LeetCode基础-图-BFS
来源:互联网 发布:驱鼠音频软件 编辑:程序博客网 时间:2024/06/01 07:55
BFS:Breadth First Search,广度优先搜索。
当有这样一个问题:计算图中两点之间的最短距离时,需要广度优先搜索,BFS 也是很多图算法的基石。
要找到顶点 s 到 顶点 v 的最短路径,从 s 开始,在所有距离 s 一条边的顶点中寻找 v,如果找不到,就继续在与 s 距离一条边的顶点中寻找 v,如此下去,走到找到 v。
深度优先搜索就好像是一个人在走迷宫,而广度优先搜索就像是一组人在朝各个方向走这个迷宫,每个人都有自己的绳子,当出现叉路时,假设一个探路人可以
分裂成多个人继续,当两个探路人相遇时,合并。
深度优先搜索就像是前序遍历一棵树(使用栈),而广度优先就像是层次遍历一棵树(使用队列)。深度优先搜索不断地在栈中保存分叉的顶点,广度优先搜索则向扇形扫描,用队列保存访问过的最前端的顶点。
逐步图解流程如下:
BFS查找路径的实现代码如下:
class BFSPaths{ private bool[] marked;// private int[] edgeTo; //到达该顶点的已知路径上的最后一个顶点 private final int s; //起点 public BFSPaths(Graph g, int s) { marked = new bool[g.V()]; edgeTo = new int[g.V()]; this.s = s; bfs(g, s); } private void bfs(Graph g, int s) { Queue<int> queue = new Queue<int>(); marked[s] = true; //标记起点 queue.enqueue(s); //入队列 while(!queue.isEmpty()) { int v = queue.dequeue(); //从队列中删去下一顶点 foreach(int w in g.adj(v)) { if(!marked[w]) { edgeTo[w] = v; //保存最短路径的最后一条边 marked[w] = true; //标记它,因为已知最短路径 queue.enqueue(w); //将它添加到队列中 } } } } public bool hasPathTo(int v) { return marked[v]; } public List<int> pathTo(int v) { if(!hasPathTo(v)) { return null; } Stack<int> path = new Stack<int>(); foreach(int x = v; x != s; x = edgeTo[x]) { path.push(x); } path.push(s); return path; }}
阅读全文
0 0
- LeetCode基础-图-BFS
- LightOJ 1012(基础图bfs)
- BFS 基础
- 图论算法基础-BFS与DFS
- LeetCode Word Ladder(BFS)
- LeetCode[BFS]: Surrounded Regions
- leetcode word ladder bfs
- LeetCode Course Schedule BFS
- LeetCode:DFS,BFS
- LeetCode 529 Minesweeper (BFS)
- LeetCode基础-图
- LeetCode基础-图-DFS
- POJ2251 BFS基础题
- poj3278~bfs基础题
- poj3278 BFS基础
- ACM基础 BFS入门
- 基础BFS+DFS poj3083
- poj1979【基础bfs/dfs】
- SmartOne——加密社区的法律解决方案
- Python 字符串的基本格式化
- 封装 继承和多态
- 欢迎使用CSDN-markdown编辑器
- C++和类
- LeetCode基础-图-BFS
- js的window.onload不执行
- Master-Worker模式
- Java设计模式2:观察者模式1
- 查看Ubantu下使用pip install 安装python模块的路径
- Eclipse 新下载运行出错
- HDU-2018(母牛的故事)
- SpringMVC 使用JSR-303进行校验 @Valid
- Python3调用face++免费API接口识别身份证信息