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.广度优先搜索相关推荐

  1. 算法导论--广度优先搜索和深度优先搜索

    广度优先搜索 在给定图G=(V,E)和一个特定的源顶点s的情况下,广度优先搜索系统地探索G中的边,以期"发现"可从s 到达的所有顶点,并计算s 到所有这些可达顶点之间的距离(即最少 ...

  2. 常用算法2 - 广度优先搜索 深度优先搜索 (python实现)

    1. 图 定义:图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合. 简单点的说:图由节点和边组成.一 ...

  3. 算法图解——广度优先搜索

    本文章根据<算法图解>提供来写的. # -*- coding = utf-8 -*- # @Time : 2021/12/14 17:20 # @Author : 宁洪康 # @File ...

  4. JS算法:广度优先搜索(BSF)的理解

    广度优先搜索方法的实现 (基于<学习JavaScript数据结构与算法>补充学习) 实现步骤如下 1.用initializeColor函数来将color数组初始化为白色:也就是将每个节点初 ...

  5. java广度优先算法,算法之广度优先搜索

    一.引言 上一次介绍的算法是深度优先搜索 这次我们来研究一下广度优先搜索,看看怎么理解以及写出这个算法 这个算法需要数据结构的基础--队列,如果没有这个基础的同学去恶补一下. 二.小小问题 Q:在一个 ...

  6. C++一本通基础算法:广度优先搜索(BFS)

    tip:该算法将会疯狂使用队列,包括各种类型的队列 算法概述:先将起点入队,先向起点相邻的位置检索,如果满足条件,那么将这个位置入队. 然后将起点出队.再将所有与队首相邻且满足条件的位置入队,队首出队 ...

  7. 【算法】广度优先搜索(BFS)和深度优先搜索(DFS)

    https://blog.csdn.net/raphealguo/article/details/7523411 https://blog.csdn.net/qq_41681241/article/d ...

  8. 小游戏系列算法之五广度优先搜索,双向广搜,八数码,华容道

    前段时间在玩仙五前,遇上了蚩尤冢拼图这个小游戏. 其实就是八数码问题,一直想着如何才能用最少步数求解,于是就写了个程序. Q1:什么是八数码问题? A1:首先假定一个3*3的棋盘(如上图),分别有1, ...

  9. 【10大基础算法】广度优先搜索-NO7

    http://www.cnblogs.com/skywang12345/p/3711483.html 广度优先搜索算法(Breadth-First-Search),是一种图形搜索算法.简单的说,BFS ...

最新文章

  1. go 切片slice删除元素的方法
  2. 微信小程序利用缓存提高接口请求性能
  3. 【bug记录】android:Program type already present: android.support.v4.app.INotificationSideChannel
  4. audio 上一首 下一首 自定义样式_被 iPhone 吹爆的最香功能,安卓也终于安排上了...
  5. 5G更大的发展在于产业应用
  6. SAP License:BW/BCS(BO)难在那里--SAP中的公司和会计凭证
  7. 03-Axure9默认元件库
  8. 华硕主板固态硬盘不识别_主板启动设置无法识别固态硬盘 - 卡饭网
  9. 无线AP与无线路由的区别
  10. 编程语言的分类,以及网络瓶颈效应
  11. laravel Specified key was too long 解决方案
  12. 【智能优化算法】改进的侏儒猫鼬优化算法(IDMO)附matlab代码
  13. Pytorch中rand,randn, random以及normal的区别
  14. (转)周鸿祎产品秘笈:小版本成就大产品
  15. 今天面完了聚成网络的php研发,面经一枚,为自己攒人品。
  16. html鼠标经过图片轻微左移,CSS——鼠标滑过放大/左移
  17. HttpSession的常见用法(javaWeb)
  18. 为什么大公司不喜欢用第三方框架?难道是因为……
  19. 计算机网络笔记第六章应用层
  20. c语言程序设计年历显示,C语言程序设计万年历

热门文章

  1. python 字符串子串_Python字符串子字符串
  2. java中堆栈内存_Java堆空间与堆栈– Java中的内存分配
  3. mac memcached_如何在Mac OS上安装Memcached Server
  4. java i18n_Java i18n – Java的国际化
  5. 初学者必学教程——JQuery的简介
  6. Java面试题:final和Object类常见的方法
  7. py 的 第 34 天
  8. iwebshop关于按钮点击提示的系列代码操作流程
  9. POJ 3037 SPFA
  10. 老李推荐:第8章2节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-解析处理命令行参数...