1. Depth-first search和Breadth-first search有什么用?
从它们的名字中可以看出,这两者都是图的搜索算法。不同于树的搜索,图搜索的基本思路是遍历每一个vertex,直到找到我们想要的结果。这两个算法实际上都是遍历。
前面我们建立起了图结构,我们可以直接知道每个vertex相邻近的vertex有哪些,但是不能直接知道任意两个vertex之间是什么关系(比如它们之间的路径啊,是不是相连啊等等)。基于Depth-first search和Breadth-first search算法,我们可以高效地解决这一问题。
2. Depth-first search的应用一:查找路径。
给定一个源头vertex(假设叫s),和任意一个vertex,他们之间的连接路径是怎样的?为了解决这一问题,我们可以用Depth-first search算法。思路如下:
首先新建两个数组,一个boolean类型,叫marked,用来记录vertex是不是被检验过(为了避免重复);一个int类型,叫edgeTo,用于记录某vertex上面连接着啥玩意儿。在遍历与s相关vertex的同时(即Depth-first search),我们顺便操作一下这两个数组。这样结束的时候,所有路径信息都被记录在edgeTo数组里面,我们可以从非常方便的查找某vertex到s的路径信息。代码如下:
public class DepthFirstPath{private boolean[] marked;//edgeTo数组,用于记录路径信息。private int[] edgeTo;private final int s;public DepthFirstPath(Graph G, int s){this.s = s;//初始化marked以及edgeTo数组,长度就是G图内vertex的个数。marked = new boolean[G.V()];edgeTo = new int[G.V()];dfs(G, s);}private void dfs(Graph G, int v){marked[v] = true;for(int w : G.adj(v))if(!marked[w]){//这个便是dfs的顺便操作,在遍历相关vertex的同时,//顺便操作了edgeTo数组。edgeTo[w] = v;dfs(w);}}public boolean hasPath(int v)//未被标记(marked值为false),说明该vertex跟s不相连,自然没有path。{ return marked[v]; }public Iterable path(int v){if(!hasPath(v)) return null;Stack<Integer> path = new Stack<>();for(int x = v; x != s; x = edgeTo[x])//路径信息提取出来,保存到stack里面。path.push(x);path.push(s);return path;}
}
3. Breadth-first search的应用一:查找路径。
Breadth-first search也是一种遍历所有元素的算法。从它的名字中就可以看出,这种算法是讲究宽度,而不是深度。Depth-first search是沿某一支不断深入下去,到头了就再回到上一节点再往下找。而Breadth-first search是很多支一起,一层层的往下进展的。当然也可以顺便操作edgeTo数组,记录路径信息。
public class BreadthFirstPaths
{private int[] edgeTo;private boolean[] marked[];private int s;public BreadthFirstPaths(Graph G, int s){maeked = new boolean[G.V()];edgeTo = new int[G.V()];this.s = s;bfs(s);}private void bsf(Graph G, int s){marked[s] = true;Queue<Integer> queue = new Queue<>();queue.enqueue(s);while(!queue.isEmpty()){int v = queue.dequeue();for(int w : G.adj())if(!marked[w]){queue.enqueue(w);edgeTo[w] = v;marked[w] = true;}                             }}public boolean hasPathTo(int v)  { return marked[v]; }  public Iterable<Integer> pathTo(int v)  {  if(!hasPathTo(v)) return null;  Stack<Integer> path = new Stack<>();  for(int x = v; x != s; x = edgeTo[v])  path.push(x);  path.push(s);  return path;  }
}                                                
4. Depth-first search的应用二:相连的vertex。
任意给出一些vertex,如何判断它们是否相连?Depth-first search算法可以以解决这个问题,代码如下:
public class CC
{//ID数组代替edgeTo数组,相连接的vertex的ID值一致。private int[] ID;private boolean[] marked;private int count;public CC(Graph G){ID = new int[G.V()];marked = new boolean[G.V()];for(int s = 0; s < G.V(); s++)if(!marked[s]){dfs(G, s);count++;}}private void dfs(Graph G, int v){marked[v] = true;ID[v] = count;for(int w : G.adj[v])if(!marked[w]){              dfs(w);}}//判断两个vertex是否相连,就是看它们的ID是否一致。public boolean connected(int v, int w){ return ID[v] == ID[w]; }
}

无向图的Depth-first search和Breadth-first Search相关推荐

  1. DFS(Depth First Search,深度优先搜索)与BFS(Breadth First Search,广度优先搜索)总结与思考

    目录 Depth First Search(dfs) 代码(递归) 代码(非递归) Breadth First Search(bfs) 代码 比较 数据结构 时间复杂度 使用 例题:岛的个数 dfs实 ...

  2. 数据结构与算法(python):广度优先搜索(Breadth First Search,BFS)和深度优先算法(Depth First Search,DFS)

    参考自 MOOC数据结构与算法Python版 目录 一.广度优先搜索 1.1 BFS算法过程 1.2 广度优先搜索算法分析 二.深度优先搜索 2.1 骑士周游 2.1.1 问题定义 2.1.2 构建骑 ...

  3. 树上的BFS(Tree Breadth First Search)

    Pattern: Tree Breadth First Search,树上的BFS 介绍来自链接:https://www.zhihu.com/question/36738189/answer/9086 ...

  4. JavaScript实现breadth First Search广度优先搜索算法(附完整源码))

    JavaScript实现breadth First Search广度优先搜索算法(附完整源码) LinkedListNode.js完整源代码 Comparator.js完整源代码 LinkedList ...

  5. C++Breadth First Search 广度优先搜索(附完整源码)

    C++Breadth First Search 广度优先搜索的实现 C++Breadth First Search 广度优先搜索实现完整源码(定义,实现,main函数测试) C++Breadth Fi ...

  6. php字符串search,js获取location.search每个查询字符串的值

    形如https://www.debug.org/temp/test2.html?a=1&b=2#ddd这样的链接,虽可通过location.search属性获取到问号后的所有查询字符串值,但要 ...

  7. 04-树7. Search in a Binary Search Tree (25)

    04-树7. Search in a Binary Search Tree (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 ...

  8. pat04-树7. Search in a Binary Search Tree (25)

    04-树7. Search in a Binary Search Tree (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 ...

  9. python search用法,Python-re中search()函数的用法详解(查找ip)

    1.首先来看一下search()和find()的区别 import re s1 = "2221155" #search 字符串第一次出现的位置 print(re.search(&q ...

  10. 深度优先搜索(Depth First Search)、广度优先搜索(Breadth First Search)

    DFS: /* 邻接表存储的图 - DFS */void Visit( Vertex V ) {printf("正在访问顶点%d\n", V); }/* Visited[]为全局变 ...

最新文章

  1. Node.js链式回调
  2. 【Groovy】编译时元编程 ( 编译时方法注入 | 使用 buildFromSpec、buildFromString、buildFromCode 进行方法注入 )
  3. leetcode217. 存在重复元素(vip题)超简单
  4. 怎样通过vb设置透视表多项选择_四个操作带你玩转数据透视表,秒杀Excel函数,提升你的工作效率...
  5. presentViewController 后调用pushViewController 无效解决方案
  6. Adobe Flex初记
  7. java生存pdf资料
  8. zigbee协议栈 任务、事件与轮询机制
  9. 玩吧公司,入职后的真实感受
  10. 行政区划代码2020(SQL)--(下)
  11. 惠民工程(最小生成树)
  12. 乳腺仿体breast phantom的MATLAB实现及探讨
  13. 反超7-11!中国新的“便利店之王”即将诞生!
  14. 替换Avada主题的Google字体
  15. 2020Java就业前景好吗?
  16. python-selenium使用 chrome chromedrive版本问题
  17. SOAP XML报文解析
  18. 调用API接口登录后,获取用户信息保存到Vuex中并渲染到Vue页面
  19. 华为无线WLAN技术(直连式组网实验)
  20. 第2节 物理层基本概念及PacketTracer仿真

热门文章

  1. 百度App iOS工程化实践: EasyBox破冰之旅
  2. 数据分析模型-(RFM,5W2H,AARRR,PEST,4P)
  3. Ajax上传文件的cache、processdata、contentType属性以及FormData对象的总结
  4. python预测糖尿病_使用决策树与随机深林预测糖尿病(python)
  5. 4.Python复杂数据类型之字典
  6. java 中showinfo方法,jmockito模拟方法中参数如何指定
  7. nlp中文本相似度匹配
  8. iPhone 隐私新规下的“大地震”:四大平台损失近百亿美元,“连用户是男是女都分不清!”...
  9. 在bing中保存自己的搜索关键字.
  10. CentOS7/8安装jq教程