BFS和DFS
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的更多相关文章
- HDU-4607 Park Visit bfs | DP | dfs
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 首先考虑找一条最长链长度k,如果m<=k+1,那么答案就是m.如果m>k+1,那么最 ...
- BFS和DFS详解
BFS和DFS详解以及java实现 前言 图在算法世界中的重要地位是不言而喻的,曾经看到一篇Google的工程师写的一篇<Get that job at Google!>文章中说到面试官问 ...
- 算法录 之 BFS和DFS
说一下BFS和DFS,这是个比较重要的概念,是很多很多算法的基础. 不过在说这个之前需要先说一下图和树,当然这里的图不是自拍的图片了,树也不是能结苹果的树了.这里要说的是图论和数学里面的概念. 以上概 ...
- 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 ...
- 算法学习之BFS、DFS入门
算法学习之BFS.DFS入门 0x1 问题描述 迷宫的最短路径 给定一个大小为N*M的迷宫.迷宫由通道和墙壁组成,每一步可以向相邻的上下左右四格的通道移动.请求出从起点到终点所需的最小步数.如果不能到 ...
- 【数据结构与算法】自己动手实现图的BFS和DFS(附完整源码)
转载请注明出处:http://blog.csdn.net/ns_code/article/details/19617187 图的存储结构 本文的重点在于图的深度优先搜索(DFS)和广度优先搜索(BFS ...
- ACM__搜素之BFS与DFS
BFS(Breadth_First_Search) DFS(Depth_First_Search) 拿图来说 BFS过程,以1为根节点,1与2,3相连,找到了2,3,继续搜2,2与4,相连,找到了4, ...
- BFS和DFS算法
昨晚刚昨晚华为笔试题,用到了BFS和DFS,可惜自己学艺不精,忘记了实现原理,现在借用大佬写的内容给自己做个提高 转自:https://www.jianshu.com/p/70952b51f0c8 图 ...
- 通俗理解BFS和DFS,附基本模板
1.BFS(宽度优先搜索):使用队列来保存未被检测的节点,按照宽度优先的顺序被访问和进出队列 打个比方:(1)类似于树的按层次遍历 (2)你的眼镜掉在了地上,你趴在地上,你总是先摸离你最近的地方,如果 ...
- [Algorithms] Graph Traversal (BFS and DFS)
Graph is an important data structure and has many important applications. Moreover, grach traversal ...
随机推荐
- 【IDEA】格式化代码技巧汇总
1.格式化 Java 代码 快捷键:Ctrl+Alt+L 2.格式化 Mapper 文件中的 SQL 关联到数据库,让 IDEA 认识你的 SQL.如何关联?选择右侧的database,添加数据库即可 ...
- Vue父子组件传值$parent , ref,$refs,props大总结
子组件: <template> <div class="child"> <slot name='meiyong'></slot> & ...
- elasticsearch 的post put 方式的对比 setting mapping设置 - 添加查询数据
1.POST和PUT都可以用于创建 2.PUT是幂等方法,POST不是.所以post用户更新,put用于新增比较合适. 参考:https://yq.aliyun.com/articles/366099 ...
- 学习笔记:CentOS7学习之十七: Linux计划任务与日志的管理
目录 学习笔记:CentOS7学习之十七: Linux计划任务与日志的管理 17.1 计划任务-at-cron-计划任务使用方法 17.1.1 at计划任务的使用 17.1.2 查看和删除at将要执行 ...
- lua table 的操作(四)
table在前面作过介绍,它是一种关联数组,这种关联指的是可以设置各类类型的key来存储值. 1.table 间的数据传递 -- 为 table a 并设置元素,然后将 a 赋值给 b,则 a 与 b ...
- *#【Python】【基础知识】【运算符】【Python的几类运算符】
Python的运算符分为以下几类: 算术运算符比较(关系)运算符赋值运算符逻辑运算符位运算符成员运算符身份运算符 以及需要考虑的:运算符优先级 一.算术运算符: 需要注意的,上图是Python 2.0 ...
- 级联-city
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title> ...
- django中的缓存 跨域问题(同源策略)
django缓存机制 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次的的后台操作 ...
- 如何找到程序的真正入口mainCRTStartup
相信大家都知道以为程序的入口为main函数,但是程序的真正的入口不是main而是mainCRTStartup,那么我们如何找到他的地址呢? 先用第一种方法,就是直接代码显示 #include<s ...
- B树,B+树的原理及区别
如图所示,区别有以下两点: 1. B+树中只有叶子节点会带有指向记录的指针(ROWID),而B树则所有节点都带有,在内部节点出现的索引项不会再出现在叶子节点中. 2. B+树中所有叶子节点都是通过指针 ...