DFS和BFS

BFS
代码步骤:
1、写出每个点和每个点的邻接点的对应关系
2、方法参数:传一个对应关系和起始点
3、创建一个队列,然后每次都移除第一个,然后把移除的邻接点添加进去,打印取出的第一个,然后循环,一直到队列没有元素
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set; public class BFS {
public static void main(String[] args) {
List list = new ArrayList();//A的邻接点
list.add("B");
list.add("C"); List list2 = new ArrayList();//B的邻接点
list2.add("A");
list2.add("C");
list2.add("D"); List list3 = new ArrayList();//C的邻接点
list3.add("A");
list3.add("B");
list3.add("D");
list3.add("E"); List list4 = new ArrayList();//D的邻接点
list4.add("B");
list4.add("C");
list4.add("E");
list4.add("F"); List list5 = new ArrayList();//E的邻接点
list5.add("C");
list5.add("D"); List list6 = new ArrayList();//F的邻接点
list6.add("D"); Map<String,List> map = new HashMap<>();//使得邻接点和该值对应上
map.put("A", list);
map.put("B", list2);
map.put("C", list3);
map.put("D", list4);
map.put("E", list5);
map.put("F", list6); BFS(map,"E"); }
/**
* 利用对列的方式
* @param map 字典
* @param s 根节点
*/
public static void BFS(Map map,String s){
List<String> queue = new ArrayList();//队列
queue.add(s);
ArrayList seen = new ArrayList();//用来放已经访问过的元素
seen.add(s);
while(queue.size()>0) {//队列没有元素位置
String vertex = (String) queue.remove(0);//每次取队列第一个元素
List<String> nodes = (List) map.get(vertex);//把vertex所有临近点
for(String w:nodes) {//遍历所有邻接点,没有包含的进入队列
if(!seen.contains(w)) {
queue.add(w);
seen.add(w);
}
}
System.out.println(vertex);
}
} }
BFS的最短路径
就是添加一个键值对,键就是该字母,值就是他的前一个字母
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set; public class BFS最短路径 {
public static void main(String[] args) {
List list = new ArrayList();
list.add("B");
list.add("C"); List list2 = new ArrayList();
list2.add("A");
list2.add("C");
list2.add("D"); List list3 = new ArrayList();
list3.add("A");
list3.add("B");
list3.add("D");
list3.add("E"); List list4 = new ArrayList();
list4.add("B");
list4.add("C");
list4.add("E");
list4.add("F"); List list5 = new ArrayList();
list5.add("C");
list5.add("D"); List list6 = new ArrayList();
list6.add("D"); Map<String,List> map = new HashMap<>();
map.put("A", list);
map.put("B", list2);
map.put("C", list3);
map.put("D", list4);
map.put("E", list5);
map.put("F", list6); BFS(map,"A"); }
/**
* 利用对列的方式
* @param map
* @param s
*/
public static void BFS(Map map,String s){
List<String> queue = new ArrayList();//队列
queue.add(s);
ArrayList seen = new ArrayList();//用来放已经访问过的元素
seen.add(s); Map parent = new HashMap();
parent.put(s, null);
while(queue.size()>0) {
String vertex = (String) queue.remove(0);//那队列第一个元素
List<String> nodes = (List) map.get(vertex);//把vertex所有临近点 for(String w:nodes) {//遍历所有邻接点,没有包含的进入队列
if(!seen.contains(w)) {
queue.add(w);
seen.add(w);
parent.put(w, vertex);//添加字符前一个字符
}
}
//System.out.println(vertex); }
//输出最短路径
String end = "E";
while(end!=null) {
System.out.println(end);
end = (String) parent.get(end);
} } }
DFS
就是把BFS的队列换成栈,根本区别就是变成移除最后一个了
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set; public class DFS {
public static void main(String[] args) {
List list = new ArrayList();
list.add("B");
list.add("C"); List list2 = new ArrayList();
list2.add("A");
list2.add("C");
list2.add("D"); List list3 = new ArrayList();
list3.add("A");
list3.add("B");
list3.add("D");
list3.add("E"); List list4 = new ArrayList();
list4.add("B");
list4.add("C");
list4.add("E");
list4.add("F"); List list5 = new ArrayList();
list5.add("C");
list5.add("D"); List list6 = new ArrayList();
list6.add("D"); Map<String,List> map = new HashMap<>();
map.put("A", list);
map.put("B", list2);
map.put("C", list3);
map.put("D", list4);
map.put("E", list5);
map.put("F", list6); DFS(map,"E"); }
/**
* 利用对列的方式
* @param map
* @param s
*/
public static void DFS(Map map,String s){
List<String> stack = new ArrayList();//栈
stack.add(s);
ArrayList seen = new ArrayList();//用来放已经访问过的元素
seen.add(s);
while(stack.size()>0) {
String vertex = (String) stack.remove(stack.size()-1);//拿队列最后一个元素
List<String> nodes = (List) map.get(vertex);//把vertex所有临近点
for(String w:nodes) {//遍历所有邻接点,没有包含的进入队列
if(!seen.contains(w)) {
stack.add(w);
seen.add(w);
}
}
System.out.println(vertex);
}
} }
DFS和BFS的更多相关文章
- Clone Graph leetcode java(DFS and BFS 基础)
题目: Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. ...
- 数据结构(12) -- 图的邻接矩阵的DFS和BFS
//////////////////////////////////////////////////////// //图的邻接矩阵的DFS和BFS ////////////////////////// ...
- 数据结构(11) -- 邻接表存储图的DFS和BFS
/////////////////////////////////////////////////////////////// //图的邻接表表示法以及DFS和BFS //////////////// ...
- 在DFS和BFS中一般情况可以不用vis[][]数组标记
开始学dfs 与bfs 时一直喜欢用vis[][]来标记有没有访问过, 现在我觉得没有必要用vis[][]标记了 看代码 用'#'表示墙,'.'表示道路 if(所有情况都满足){ map[i][j]= ...
- 图论中DFS与BFS的区别、用法、详解…
DFS与BFS的区别.用法.详解? 写在最前的三点: 1.所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次. 2.实现bfs和dfs都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵 ...
- 图论中DFS与BFS的区别、用法、详解?
DFS与BFS的区别.用法.详解? 写在最前的三点: 1.所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次. 2.实现bfs和dfs都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵 ...
- 数据结构基础(21) --DFS与BFS
DFS 从图中某个顶点V0 出发,访问此顶点,然后依次从V0的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和V0有路径相通的顶点都被访问到(使用堆栈). //使用邻接矩阵存储的无向图的深度 ...
- dfs和bfs的区别
详见转载博客:https://www.cnblogs.com/wzl19981116/p/9397203.html 1.dfs(深度优先搜索)是两个搜索中先理解并使用的,其实就是暴力把所有的路径都搜索 ...
- 邻接矩阵实现图的存储,DFS,BFS遍历
图的遍历一般由两者方式:深度优先搜索(DFS),广度优先搜索(BFS),深度优先就是先访问完最深层次的数据元素,而BFS其实就是层次遍历,每一层每一层的遍历. 1.深度优先搜索(DFS) 我一贯习惯有 ...
- 判断图连通的三种方法——dfs,bfs,并查集
Description 如果无向图G每对顶点v和w都有从v到w的路径,那么称无向图G是连通的.现在给定一张无向图,判断它是否是连通的. Input 第一行有2个整数n和m(0 < n,m < ...
随机推荐
- d3.event=null
d3功能奇多, 已经模块化,(其实感觉和react差不多了). 所以默认打包的单个文件 <script src="https://d3js.org/d3.v5.min.js" ...
- Lab 10-1
This lab includes both a driver and an executable. You can run the executable from anywhere, but in ...
- Mysql报错[Warning] TIMESTAMP with implicit DEFAULT value is deprecated和Buffered warning: Changed limits
报错2019-04-24 12:06:46 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use -- ...
- 【PHP函数】PHP 去掉字符串中的转义符号
PHP字符串中的转义符号 string stripslashes ( string $str ) //去掉字符串中的反斜线字符.若是连续二个反斜线,则去掉一个,留下一个.若只有一个反斜线,就直接去掉.
- c语言经典小程序
1:题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. mai ...
- 基于服务器AAA实验
---恢复内容开始--- 一.实验拓扑 二.实验地址分配 设备 端口 ip 掩码 AAAA g0/0 and se0/3/0 192.168.1.1 and 192.168.4.1 2 ...
- idea中xml打开方式变成file,代码变成灰色
耗费了很久啊.... 新建文件的时候没有输入后缀.xml.自此无论复制修改还是新建都是文件的格式,其他名字倒是可以,但是我不能修改名字. 解决办法: OK了:
- Octopus501工作站环境配置
操作系统 Ubuntu18.04LTS(Ubuntu16.04) 远程桌面 Xtce4桌面系统(mate桌面系统)+vncserver远程桌面服务器 远程ssh连接登录 ssh服务器 文件系统 vsF ...
- Android 工程越来越大,运行变卡解决方法
打开AS的安装目录 android-studio/bin/studio.exe.vmoptions studio64.exe.vmoptions -Xms2048m-Xmx2048m-XX:Reser ...
- SQL Pretty Printer for SSMS 很不错的SQL格式化插件
写SQL语句或者脚本时,看到凌乱的格式就头大了,于是决心找一款SQL语句格式化的工具. 功夫不负有心人还真的被我找到一款很好用,很方便的SQL Server插件:SQL Pretty Printer ...