算法—12.广度优先搜索
1.具体算法
/*** Created by huazhou on 2015/12/6.*/
public class TestSearch {public static void main(String[] args){Graph G = new Graph(new In(args[0]));int s = Integer.parseInt(args[1]);
// DepthFirstSearch search = new DepthFirstSearch(G, s);
// Paths search = new Paths(G, s);
// DepthFirstSearch search = new DepthFirstSearch(G,s);BreadthFirstPaths search = new BreadthFirstPaths(G,s);findAllPaths(search, G, s);}private static void findAllPaths(BreadthFirstPaths search, Graph G, int s){for(int v = 0; v < G.V(); v++){StdOut.print(s + " to " + v + ": ");if(search.hasPathTo(v)){for (int x : search.pathTo(v)){if(x == s){StdOut.print(x);}else{StdOut.print("-" + x);}}}StdOut.println();}}
}
/*** 算法4.2 使用广度优先搜索查找图中的路径* Created by huazhou on 2015/12/9.*/
public class BreadthFirstPaths {private boolean[] marked; //到达该顶点的最短路径已知吗?private int[] edgeTo; //到达该顶点的已知路径上的最后一个顶点private int s; //起点public BreadthFirstPaths(Graph G, int s){marked = new boolean[G.V()];edgeTo = new int[G.V()];this.s = s;bfs(G, s);}private void bfs(Graph G, int s){Queue<Integer> queue = new Queue<Integer>();marked[s] = true; //标记起点queue.enqueue(s); //将它加入队列while(!queue.isEmpty()){int v = queue.dequeue(); //从队列中删去下一顶点for (int w : G.adj(v)){//对于每个未被标记的相邻顶点if(!marked[w]){edgeTo[w] = v; //保持最短路径的最后一条边marked[w] = true; //标记它,因为最短路径已知queue.enqueue(w); //并将它添加到队列中}}}}public boolean hasPathTo(int v){return marked[v];}public Iterable<Integer> pathTo(int v){if(!hasPathTo(v)){return null;}Stack<Integer> path = new Stack<Integer>();for (int x = v; x != s; x = edgeTo[x]){path.push(x);}path.push(s);return path;}
}
2.执行过程
3.算法分析
命题:对于从s可达的任意顶点v,广度优先搜索都能找到一条从s到v的最短路径(没有其他从s到v的路径所含的边比这条路径更少)
命题:广度优先搜索所需的时间在最坏情况下和V+E成正比。
【源码下载】
转载于:https://www.cnblogs.com/joey-hua/p/5048370.html
算法—12.广度优先搜索相关推荐
- 算法导论--广度优先搜索和深度优先搜索
广度优先搜索 在给定图G=(V,E)和一个特定的源顶点s的情况下,广度优先搜索系统地探索G中的边,以期"发现"可从s 到达的所有顶点,并计算s 到所有这些可达顶点之间的距离(即最少 ...
- 常用算法2 - 广度优先搜索 深度优先搜索 (python实现)
1. 图 定义:图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合. 简单点的说:图由节点和边组成.一 ...
- 算法图解——广度优先搜索
本文章根据<算法图解>提供来写的. # -*- coding = utf-8 -*- # @Time : 2021/12/14 17:20 # @Author : 宁洪康 # @File ...
- JS算法:广度优先搜索(BSF)的理解
广度优先搜索方法的实现 (基于<学习JavaScript数据结构与算法>补充学习) 实现步骤如下 1.用initializeColor函数来将color数组初始化为白色:也就是将每个节点初 ...
- java广度优先算法,算法之广度优先搜索
一.引言 上一次介绍的算法是深度优先搜索 这次我们来研究一下广度优先搜索,看看怎么理解以及写出这个算法 这个算法需要数据结构的基础--队列,如果没有这个基础的同学去恶补一下. 二.小小问题 Q:在一个 ...
- C++一本通基础算法:广度优先搜索(BFS)
tip:该算法将会疯狂使用队列,包括各种类型的队列 算法概述:先将起点入队,先向起点相邻的位置检索,如果满足条件,那么将这个位置入队. 然后将起点出队.再将所有与队首相邻且满足条件的位置入队,队首出队 ...
- 【算法】广度优先搜索(BFS)和深度优先搜索(DFS)
https://blog.csdn.net/raphealguo/article/details/7523411 https://blog.csdn.net/qq_41681241/article/d ...
- 小游戏系列算法之五广度优先搜索,双向广搜,八数码,华容道
前段时间在玩仙五前,遇上了蚩尤冢拼图这个小游戏. 其实就是八数码问题,一直想着如何才能用最少步数求解,于是就写了个程序. Q1:什么是八数码问题? A1:首先假定一个3*3的棋盘(如上图),分别有1, ...
- 【10大基础算法】广度优先搜索-NO7
http://www.cnblogs.com/skywang12345/p/3711483.html 广度优先搜索算法(Breadth-First-Search),是一种图形搜索算法.简单的说,BFS ...
最新文章
- go 切片slice删除元素的方法
- 微信小程序利用缓存提高接口请求性能
- 【bug记录】android:Program type already present: android.support.v4.app.INotificationSideChannel
- audio 上一首 下一首 自定义样式_被 iPhone 吹爆的最香功能,安卓也终于安排上了...
- 5G更大的发展在于产业应用
- SAP License:BW/BCS(BO)难在那里--SAP中的公司和会计凭证
- 03-Axure9默认元件库
- 华硕主板固态硬盘不识别_主板启动设置无法识别固态硬盘 - 卡饭网
- 无线AP与无线路由的区别
- 编程语言的分类,以及网络瓶颈效应
- laravel Specified key was too long 解决方案
- 【智能优化算法】改进的侏儒猫鼬优化算法(IDMO)附matlab代码
- Pytorch中rand,randn, random以及normal的区别
- (转)周鸿祎产品秘笈:小版本成就大产品
- 今天面完了聚成网络的php研发,面经一枚,为自己攒人品。
- html鼠标经过图片轻微左移,CSS——鼠标滑过放大/左移
- HttpSession的常见用法(javaWeb)
- 为什么大公司不喜欢用第三方框架?难道是因为……
- 计算机网络笔记第六章应用层
- c语言程序设计年历显示,C语言程序设计万年历
热门文章
- python 字符串子串_Python字符串子字符串
- java中堆栈内存_Java堆空间与堆栈– Java中的内存分配
- mac memcached_如何在Mac OS上安装Memcached Server
- java i18n_Java i18n – Java的国际化
- 初学者必学教程——JQuery的简介
- Java面试题:final和Object类常见的方法
- py 的 第 34 天
- iwebshop关于按钮点击提示的系列代码操作流程
- POJ 3037 SPFA
- 老李推荐:第8章2节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-解析处理命令行参数...