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 ...
随机推荐
- RestHighLevelClient 之 Scroll
ES中默认最大查询结果为10000,大于10000时查不出结果,报错超过最大值,如把 from调到大于10000. 针对这个问题,有两种解决办法. 第一种,修改 max_result_window 很 ...
- 【miscellaneous】如何利用硬盘号和CPU序列号为软件加密
原文:http://www.jiamisoft.com/blog/index.php/3469-yingpanhaocpuruanjianjiami.html 计算机软件是一种特殊的产品,为了防止软件 ...
- iostream
cout 星号*为默认 控制符 描 述 控制符 描 述 *dec 以十进制形式输出整数 hex 以十六进制形式输出整数 oct 以八进制形式输出整数 fixed 以普通小数形式输出浮点数 scient ...
- 我的vim开发环境搭建:C/C++/Go,持续更新中
懒得在github博客上折腾评论功能,先借用博客园推广下,虽然好像也没什么用. 我的vim开发环境搭建(1): 准备工作 我的vim开发环境搭建(2): 常用的vim插件 我的vim开发环境搭建(3) ...
- Nginx 小入门记录 之 初识Nginx和环境准备(一)
前置知识准备: 如果还不知道服务器是干什么的,只是刚踏入程序员之路的,大家还是先学习基础,虽然以下文档很简单,但至少知道为什么要学: 一般服务器环境现在基本上都是放在Linux系统上了,如果对Linu ...
- java开源APM概要
候选APM naver/pinpoint(github上2148个star) 韩国的一个公司开源的,有待评估使用情况,就是整体还不是JDK8,有些还是有点费劲,技术上采用agent的方式,对jav ...
- lg 1478
好多天没碰代码了,感觉忘得差不多了,没有学习感觉罪恶深重,从今天起开始补题啊啊! 简单零一背包,套模板就行. #include<bits/stdc++.h> using namespace ...
- B - How many integers can you find
Now you get a number N, and a M-integers set, you should find out how many integers which are smal ...
- axios拦截器的介绍
interceptors 拦截器 拦截器一般做什么? 1. 修改请求头的一些配置项 2. 给请求的过程添加一些请求的图标 3. 给请求添加参数 拦截器的基本语法: 拦截器分为全局拦截器和局部拦截器 全 ...
- selenium登录百度
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.s ...