广度优先搜索(breadth-first search,BFS)

2023-10-28 10:59

本文主要是介绍广度优先搜索(breadth-first search,BFS),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

广度优先搜索(breadth-first search,BFS)

应用场景:到X的最短路径

原理:搜索范围从起点向外延伸,先查一度关系,再查二度关系,以此类推

这样不仅能找到A到B的路径,而且找到的还是最短的路径

注意:只有按关系层级顺序查找才能找到最短路径

使用的数据结构:

队列(Queue),先进先出(FIFO)

散列表(Map),用来映射元素下一层级关联的元素,在下面例子中对应某个人的朋友们

运行时间:O(V+E) V:边数 E:顶点数
整个关系网中,你将沿着每条边前进,所有运行时间最少为O(边数)

你要把需要检查的人加入到队列中,每个人需要O(1),每个人都需要这样做,一共O(人数)

即广度优先搜索的运行时间为O(人数+边数) 人数:顶点数V(vertice)

样例:找出下面关系网中距离最近的销售商(名字结尾为m的人)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iZ0SLUmX-1647241989039)(D:\Markdown图片\image-20220314150905396.png)]

private static Set<String> set = new HashSet<>();
private static void breadthFirstSearch(Map<String, Object> map, Queue<String> queue) {while (queue.size() > 0) {// 获取队列头一个元素并出队String first = queue.remove();// 没有被检查过才可以进行检查if (!checkRepeat(first)) {// 判断是否是所要元素if(personIsSeller(first)) {System.out.println(first + "是售货商!");// 找到了售货商 结束程序return;}// 不是的话把它的朋友加入到队列尾部else {if (map.get(first) instanceof String[]) {String[] firends = (String[]) map.get(first);queue.addAll(Arrays.asList(firends));} else if (map.get(first) instanceof String) {String firend = (String) map.get(first);queue.add(firend);}}}}
}

判断这个人是否是销售商

private static boolean personIsSeller(String person) {// 把每个检查的元素放入Set集合中set.add(person);// substring(int index)方法去截字符串位置index及以后的所有字符串,// substring(int from ,int to)方法是前闭后开的,即[from,to),可以理解为[from,to-1]if (person.substring(person.length()-1).equals("m")) {return true;}return false;
}

判断这个人有没有被检查过

// 你的朋友也可能是你朋友的朋友 可能
// 这里要把所有检查过的人添加到Set集合中,以免重复检查,如果是双向图可能会造成无限循环
public static boolean checkRepeat(String person) {if (set.contains(person)) {System.out.println(person + "重复了!");return true;}return false;
}

Test

public static void main(String[] args) {Map<String, Object> map = new HashMap<>();String[] you = {"alice","bob","claire"};map.put("you", you);String[] bob = {"anuj","peggy"};map.put("bob", bob);map.put("alice", "peggy");String[] claire = {"thom", "jonny"};map.put("claire", claire);map.put("anuj", null);map.put("peggy", null);map.put("thom", null);map.put("jonny", null);// 把第一层级的朋友加入队列Queue<String> queue = new LinkedList<>();queue.addAll(Arrays.asList(you));breadthFirstSearch(map, queue);
}

打印结果

peggy重复了!
thom是售货商!

这篇关于广度优先搜索(breadth-first search,BFS)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/292755

相关文章

hdu1254(嵌套bfs,两次bfs)

/*第一次做这种题感觉很有压力,思路还是有点混乱,总是wa,改了好多次才ac的思路:把箱子的移动当做第一层bfs,队列节点要用到当前箱子坐标(x,y),走的次数step,当前人的weizhi(man_x,man_y),要判断人能否将箱子推到某点时要嵌套第二层bfs(人的移动);代码如下:

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

poj 3190 优先队列+贪心

题意: 有n头牛,分别给他们挤奶的时间。 然后每头牛挤奶的时候都要在一个stall里面,并且每个stall每次只能占用一头牛。 问最少需要多少个stall,并输出每头牛所在的stall。 e.g 样例: INPUT: 51 102 43 65 84 7 OUTPUT: 412324 HINT: Explanation of the s

poj 2431 poj 3253 优先队列的运用

poj 2431: 题意: 一条路起点为0, 终点为l。 卡车初始时在0点,并且有p升油,假设油箱无限大。 给n个加油站,每个加油站距离终点 l 距离为 x[i],可以加的油量为fuel[i]。 问最少加几次油可以到达终点,若不能到达,输出-1。 解析: 《挑战程序设计竞赛》: “在卡车开往终点的途中,只有在加油站才可以加油。但是,如果认为“在到达加油站i时,就获得了一

hdu 4517 floyd+记忆化搜索

题意: 有n(100)个景点,m(1000)条路,时间限制为t(300),起点s,终点e。 访问每个景点需要时间cost_i,每个景点的访问价值为value_i。 点与点之间行走需要花费的时间为g[ i ] [ j ] 。注意点间可能有多条边。 走到一个点时可以选择访问或者不访问,并且当前点的访问价值应该严格大于前一个访问的点。 现在求,从起点出发,到达终点,在时间限制内,能得到的最大

poj 2195 bfs+有流量限制的最小费用流

题意: 给一张n * m(100 * 100)的图,图中” . " 代表空地, “ M ” 代表人, “ H ” 代表家。 现在,要你安排每个人从他所在的地方移动到家里,每移动一格的消耗是1,求最小的消耗。 人可以移动到家的那一格但是不进去。 解析: 先用bfs搞出每个M与每个H的距离。 然后就是网络流的建图过程了,先抽象出源点s和汇点t。 令源点与每个人相连,容量为1,费用为

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

hdu4277搜索

给你n个有长度的线段,问如果用上所有的线段来拼1个三角形,最多能拼出多少种不同的? import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;