博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DFS和BFS
阅读量:4946 次
发布时间:2019-06-11

本文共 6107 字,大约阅读时间需要 20 分钟。

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
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
queue = new ArrayList();//队列 queue.add(s); ArrayList seen = new ArrayList();//用来放已经访问过的元素 seen.add(s); while(queue.size()>0) {
//队列没有元素位置 String vertex = (String) queue.remove(0);//每次取队列第一个元素 List
nodes = (List) map.get(vertex);//把vertex所有临近点 for(String w:nodes) {
//遍历所有邻接点,没有包含的进入队列 if(!seen.contains(w)) { queue.add(w); seen.add(w); } } System.out.println(vertex); } } }
View Code

 

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
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
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
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); } } }
View Code

 

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
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
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
nodes = (List) map.get(vertex);//把vertex所有临近点 for(String w:nodes) {
//遍历所有邻接点,没有包含的进入队列 if(!seen.contains(w)) { stack.add(w); seen.add(w); } } System.out.println(vertex); } } }
View Code

 

转载于:https://www.cnblogs.com/zhazhaboke/p/10561576.html

你可能感兴趣的文章
UVA-1611 Crane (构造)
查看>>
linux下的watch命令
查看>>
鼠标滚动兼容
查看>>
WebServer
查看>>
Perl 三种时间time,localtime,gmttime
查看>>
用unity surface shader 重新渲染dota2 模型
查看>>
BZOJ—— 3402: [Usaco2009 Open]Hide and Seek 捉迷藏
查看>>
codevs——T3657 括号序列
查看>>
读书笔记1
查看>>
[spring-boot] 健康状况监控
查看>>
Android 生命周期
查看>>
B. Complete the Word(Codeforces Round #372 (Div. 2)) 尺取大法
查看>>
Codeforces Round #540 (Div. 3)题解
查看>>
css选择器,伪类和伪元素的区别
查看>>
Linux系统调优及安全设置
查看>>
页面不可编辑
查看>>
oracle安装数据库中文乱码解决办法
查看>>
Keepalived 的使用
查看>>
Zabbix-微信报警
查看>>
小学奥数 蓄水池水管问题
查看>>