<pre name="code" class="java">
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Queue; /*广度遍历是遍历到某个顶点,然后訪问其连接点a,b。接着訪问a的连接表,
非常自然的,这种数据结构就是HashMap,以顶点为key。保存每一个顶点的连接表
*/
public class BFS {
static int count=0;
/*
* HashMap<Character,LinkedList<Character>> graph 这个HashMap是用于存放图中每一个node的邻接表
* 表示此映射所维护的键的类型为Character。此映射值的类型为LinkedList<Character> graph
* 表示将映射关系存放在graph此映射中
*
* LinkedList<Character> 表示在此Collection中保持元素类型为Character
*
* HashMap<Character,Integer> dist 这个HashMap 是用于存放每一个node与距离顶点s的距离的映射关系
* 表示此映射所维护的键的类型为Character 此映射所维护的值的类型为Integer。dist表示将映射关系存放到dist此映射中
*/
private void bfs(HashMap<Character, LinkedList<Character>> graph,
HashMap<Character, Integer> dist, char start) {
// Queue<Character> 表示在此Collection中所保存的元素的类型为Character
Queue<Character> q = new LinkedList<Character>();
q.add(start);// 将指定元素s插入队列,成功时返回true,假设没有可用空间。则返回illegalStateException
//put(start,0) start为指定值将要关联的键,0为指定值将要关联的值。 假设start与0的映射关系已存在,则返回并替换旧值0
//假设 start与0的映射关系不存在,则返回null
dist.put(start, 0);
int i = 0;
while (!q.isEmpty())//
{
char top = q.poll();// 获取并移除队列的头,返回队列的头,假设队列为空。返回null
i++;
// dist.get(top) 返回指定键top所映射的值
System.out.println("The " + i + "th element:" + top+ " Distance from s is:" + dist.get(top));
int d = dist.get(top) + 1;// 得出其周边还未被訪问的节点的距离
/*
* graph.get(top)假设此映射包括一个满足 (key==null ? k==null : key.equals(k))
* 的从 k 键到 v 值的映射关系,则此方法返回 v;否则返回 null。(最多仅仅能有一个这种映射关系。 )
* for(元素变量:元素集合),假设元素集合中全部元素都已遍历过,则结束此循环。 否则运行for循环里的程序块
*/
for (Character c : graph.get(top)) {
// containskey(key) 假设此映射包括对于指定键key的映射关系,则返回true
if (!dist.containsKey(c))// 假设dist中还没有该元素说明还没有被訪问
{
//关联指定键c与指定值d。假设关联关系已存在。则替换旧值d。返回旧值d, 假设无映射关系,则返回null
dist.put(c, d);
q.add(c); // 将指定元素c插入队列,成功时返回true。假设没有可用空间,则返回illegalStateException
}
}
}
}
private static void dfs(HashMap<Character , LinkedList<Character>> graph,HashMap<Character, Boolean> visited)
{
visit(graph, visited, 's');
}
private static void visit(HashMap<Character , LinkedList<Character>> graph,HashMap<Character, Boolean> visited,char start)
{ if (!visited.containsKey(start)) {
count++;
System.out.println("The time into element " + start + ":" + count);// 记录进入该节点的时间
visited.put(start, true);
for (Character c : graph.get(start)) {
if (!visited.containsKey(c)) {
visit(graph, visited, c);// 递归訪问其邻近节点
}
}
count++;
System.out.println("The time out element " + start + ":" + count);// 记录离开该节点的时间
}
}
public static void main(String args[]) {
BFS bb = new BFS();
// s顶点的邻接表
LinkedList<Character> list_s = new LinkedList<Character>();
list_s.add('w');
list_s.add('r');
LinkedList<Character> list_w = new LinkedList<Character>();
list_w.add('s');
list_w.add('x');
list_w.add('i');
LinkedList<Character> list_r = new LinkedList<Character>();
list_r.add('s');
list_r.add('v');
LinkedList<Character> list_x = new LinkedList<Character>();
list_x.add('w');
list_x.add('y');
list_x.add('u');
LinkedList<Character> list_v = new LinkedList<Character>();
list_v.add('r');
LinkedList<Character> list_i = new LinkedList<Character>();
list_i.add('w');
LinkedList<Character> list_u = new LinkedList<Character>();
list_u.add('x');
LinkedList<Character> list_y = new LinkedList<Character>();
list_y.add('x');
HashMap<Character, LinkedList<Character>> graph = new HashMap<Character, LinkedList<Character>>();
graph.put('s', list_s);
graph.put('w', list_w);
graph.put('r', list_r);
graph.put('x', list_x);
graph.put('v', list_v);
graph.put('i', list_i);
graph.put('y', list_y);
graph.put('u', list_u);
System.out.println("BFS starts:");
HashMap<Character, Integer> dist = new HashMap<Character, Integer>();
char start = 's';
bb.bfs(graph, dist, start);
System.out.println("DFS starts:");
HashMap<Character, Boolean> visited=new HashMap<Character, Boolean>();
bb.dfs(graph, visited);
}
}

BFS和DFS的java实现的更多相关文章

  1. 【算法】二叉树、N叉树先序、中序、后序、BFS、DFS遍历的递归和迭代实现记录(Java版)

    本文总结了刷LeetCode过程中,有关树的遍历的相关代码实现,包括了二叉树.N叉树先序.中序.后序.BFS.DFS遍历的递归和迭代实现.这也是解决树的遍历问题的固定套路. 一.二叉树的先序.中序.后 ...

  2. BFS和DFS详解

    BFS和DFS详解以及java实现 前言 图在算法世界中的重要地位是不言而喻的,曾经看到一篇Google的工程师写的一篇<Get that job at Google!>文章中说到面试官问 ...

  3. hdu--1026--Ignatius and the Princess I(bfs搜索+dfs(打印路径))

    Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  4. BFS与DFS常考算法整理

    BFS与DFS常考算法整理 Preface BFS(Breath-First Search,广度优先搜索)与DFS(Depth-First Search,深度优先搜索)是两种针对树与图数据结构的遍历或 ...

  5. 聊聊算法——BFS和DFS

    如果面试字节跳动和腾讯,上来就是先撕算法,阿里就是会突然给你电话,而且不太在意是周末还是深夜, 别问我怎么知道的,想确认的可以亲自去试试.说到算法,直接力扣hard三百题也是可以的,但似乎会比较伤脑, ...

  6. HDU-4607 Park Visit bfs | DP | dfs

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 首先考虑找一条最长链长度k,如果m<=k+1,那么答案就是m.如果m>k+1,那么最 ...

  7. 算法录 之 BFS和DFS

    说一下BFS和DFS,这是个比较重要的概念,是很多很多算法的基础. 不过在说这个之前需要先说一下图和树,当然这里的图不是自拍的图片了,树也不是能结苹果的树了.这里要说的是图论和数学里面的概念. 以上概 ...

  8. 算法学习之BFS、DFS入门

    算法学习之BFS.DFS入门 0x1 问题描述 迷宫的最短路径 给定一个大小为N*M的迷宫.迷宫由通道和墙壁组成,每一步可以向相邻的上下左右四格的通道移动.请求出从起点到终点所需的最小步数.如果不能到 ...

  9. 【数据结构与算法】自己动手实现图的BFS和DFS(附完整源码)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/19617187 图的存储结构 本文的重点在于图的深度优先搜索(DFS)和广度优先搜索(BFS ...

随机推荐

  1. 考勤的lua脚本

    ngx.header.content_type = "text/plain;charset=utf-8" local cjson = require "cjson&quo ...

  2. 818E - Card Game Again(尺取法)

    818E - Card Game Again 题意 给出一个数列,选择连续的一段使得这些数字的乘积是 k 的倍数,问合法的方案数. 分析 尺取法.设 num 为连续的数的乘积,只要对于 k 的每个素因 ...

  3. 理解boot.img与静态分析Android/linux内核

    一些尝试和理解. 1>提取boot.img: 其中,msm代表是高通的芯片,msm_sdcc.1是外接的SD卡挂载的目录,by-name指的是这个sd卡分区的名称.下面几行代表每个分区存储的东西 ...

  4. Java Socket编程详细解说

    Java Socket编程 JavaSocketServerSocket乱码超时 Java Socket编程 对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是So ...

  5. 【NOIP模拟赛】【乱搞AC】【贪心】【模拟】匹配

    匹配 (match.pas/match.c/match.cpp) [题目描述] 到了新的学期,Mcx痛苦的发现通用技术课居然是有实验课的,这样的话他就不得不放弃写作业的想法而去做一件类似于搭积木的事情 ...

  6. Extjs Ext.grid.column.Column 隐藏显示列

    1.根据字段名字 grid.down("gridcolumn[dataIndex=PLAN_QTY]").show();//hide() 2.根据列号 grid.columns[1 ...

  7. ThinkPHP的自动验证常用的正则

    ThinkPHP的自动验证常用的正则   ThinkPHP的自动验证机制是为了进行表单数据验证,验证可以支持function. callback.confirm.equal.unique和regex, ...

  8. Parse error: syntax error, unexpected end of file in *.php on line * 解决方法

    Parse error: syntax error, unexpected end of file in *.php on line * 解决方法   这篇文章主要介绍了PHP错误Parse erro ...

  9. linux之ls指令的关键字过滤显示

    假设~/admin的文件夹下面有几个文件: a.pm b.pm c.pl d.pl e.pml 想只显示.pm结尾的可以用: ls *.pm 或者 ls | grep .pm,两者等价. 想显示b.开 ...

  10. nginx服务器设置path_info模式

    1.find / -name nginx.conf找到nginx配置文件 2. ## The default server#server { listen 80; #填写自己的域名 server_na ...