1.图的两种遍历方式

图的遍历通常有两种方式,即深度优先搜索(Depth First Search)和广度优先搜索(Breadth First Search)。前者类似于树的先序遍历,而后者类似于树的层次遍历。

2.深搜的实现

从节点A开始,找到第一个邻接点B,接着按照深搜的策略,寻找B的第一个邻接节点,结果是A,但是A已经被访问过了,所以应该选择节点M访问。同B一样,M找到邻接节点B、L和J,B被访问过,而L和J选择存储位置靠前的节点——L。接着L找到J,但是J的邻接节点全部都被访问过,因此退回节点L,同样L的所有邻接节点也全部被访问过,退回到节点M,B直到A。A访问第二个邻接点C,C没有被访问过且没有邻居节点,再退回到A,A访问F,最后一个L已被访问。

    public void DFS(int i, boolean [] visited)
{
if (visited[i] == false)
{System.out.print(vertex.get(i)); visited[i] = true;}
for (int j = 0; j < visited.length; j++)
{
if(adj[i][j] == 1 && visited [j] == false)
DFS(j,visited);
}
} public void DFS()
{
boolean [] visited = new boolean [Vnum];
for (int i = 0; i < visited.length; i++)
visited[i] = false; for (int i = 0; i < visited.length; i++)
if(!visited[i])
DFS(i,visited); }

测试代码

        int number = 7;
Graph <Character> g= new Graph<>(number);
for (int j = 0; j < number; j++)
g.addVertex((char)('A' + j)); g.addEdge(1,2);
g.addEdge(1,3);
g.addEdge(1,4);
g.addEdge(1,5);
g.addEdge(2,7);
g.addEdge(5,6);
g.addEdge(5,7);
g.addEdge(7,6);
g.DFS();

深度搜索结果为ABGEFCD(其中D,E,F,G代替图中的F,L,J,M)

3.广搜的实现

首先从A开始访问,接着按顺序访问邻接点C,D和F。然后从C开始访问邻接点B(D被访问过了),接着是D,F的邻接点。最终顺序应该是ACDFBGE。既然是借鉴树的层次遍历,可以使用如下示意图表示广度搜索。

    public void BFS()
{
boolean [] visited = new boolean [Vnum];
Queue q = new Queue();
q.AddQueue(0); for (int i = 0; i < visited.length; i++)
visited[i] = false; while (!q.isEmpty()){ int m = q.OutQueue();
if (visited[m] == false) {
visited[m] = true;
System.out.print(vertex.get(m));
}
for (int j = 0; j < visited.length; j++)
{
if(adj[m][j] == 1 && visited [j] == false)
{
q.AddQueue(j);
}
} } }

测试

        g.addEdge(2,3);
g.addEdge(1,3);
g.addEdge(1,4);
g.addEdge(1,6);
g.addEdge(3,4);
g.addEdge(5,7);
g.addEdge(7,6);
g.BFS();

结果ACDFBGE

全部代码查看Graph

BFS和DFS的更多相关文章

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

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

  2. BFS和DFS详解

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

  3. 算法录 之 BFS和DFS

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

  4. 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 ...

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

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

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

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

  7. ACM__搜素之BFS与DFS

    BFS(Breadth_First_Search) DFS(Depth_First_Search) 拿图来说 BFS过程,以1为根节点,1与2,3相连,找到了2,3,继续搜2,2与4,相连,找到了4, ...

  8. BFS和DFS算法

    昨晚刚昨晚华为笔试题,用到了BFS和DFS,可惜自己学艺不精,忘记了实现原理,现在借用大佬写的内容给自己做个提高 转自:https://www.jianshu.com/p/70952b51f0c8 图 ...

  9. 通俗理解BFS和DFS,附基本模板

    1.BFS(宽度优先搜索):使用队列来保存未被检测的节点,按照宽度优先的顺序被访问和进出队列 打个比方:(1)类似于树的按层次遍历 (2)你的眼镜掉在了地上,你趴在地上,你总是先摸离你最近的地方,如果 ...

  10. [Algorithms] Graph Traversal (BFS and DFS)

    Graph is an important data structure and has many important applications. Moreover, grach traversal ...

随机推荐

  1. MySql中的count、NULL和空串的区别

    **1.count (1).count (*) 与 count (列名) 的区别** 表 count(1) count(*) count (列名) 作用 统计表中的所有的记录数 会统计表中的所有的记录 ...

  2. 使用Dockerfile创建ssh服务的镜像02

    使用Dockerfile创建ssh服务的镜像02 1:创建工作目录---一个镜像的所有文件都放这个目录下 ubuntu@ubuntu:~$ mkdir sshd_ubuntu ubuntu@ubunt ...

  3. vue中页面跳转拦截器的实现方法

    首先对index.js的router进行配置; export default new Router({ routes: [ { path: '/consultancy', name: 'consult ...

  4. linux报错Loading mirror speeds from cached hostfile解决方法

    首先本人当时也是遇到这个问题,首先配置了虚拟机的 yum,移步这篇博客https://www.cnblogs.com/xuzhaoyang/p/11239096.html 然后在进行了如下操作 首先还 ...

  5. java CGLib代理

    转载自   cglib之Enhancer 1. 背景 cglib库的Enhancer在Spring AOP中作为一种生成代理的方式被广泛使用.本文针对Enhancer的用法以实际代码为例作一些介绍. ...

  6. 使用pycharm开发web——django2.1.5(三)创建models并进入交互界面shell做一些简单操作

    这里model可以认为是数据对象本身 相当于在写java代码时候model目录下创建的实体类,models.py 中可以包含多个实体类,感觉这个操作挺骚的 下面是polls app里面的models, ...

  7. springboot通过slf4j配置日志

    原因:SpringBoot默认使用slf4j日志,引入其他框架的时候,只需要把这个框架依赖的日志框架排除掉: 而我今天想引入log4j的时候,pom文件一直报错,显示找不到log4j的jar包,应当是 ...

  8. Docker 镜像的制作

        1.登录docker            docker ecex –it 容器名/容器id /bin/bash        例如:            docker exec –it t ...

  9. python — 函数基础知识(一)

    目录 1 面向过程编程与函数式编程 2 函数的基本结构 3 函数的参数 1 面向过程编程与函数式编程 截至目前我们所接触.所写的编程为:面向过程式编程[可读性差/可重用性差] # 面向过程编程 use ...

  10. 怎样查看 MySQL 版本号

    1. 在命令行中直接查看版本号 mysql -V 2. 在 mysql --help 中查找与版本相关的信息 mysql --help | grep Ver 3. 在mysql命令行里面查看版本信息 ...