图的DFS与BFS遍历
一、图的基本概念
1、邻接点:对于无向图无v1 与v2之间有一条弧,则称v1与v2互为邻接点;对于有向图而言<v1,v2>代表有一条从v1到v2的弧,则称v2为v1的邻接点。
2、度:就是与该顶点相互关联的弧的个数。
3、连通图:无向图的每个顶点之间都有可达路径,则称该无向图为连通图。有向图每个顶点之间都有<v1,v2>和<v2,v1>,则称此有向图为强连通图。
二、存储结构
1、邻接矩阵存储(Adjacency Matrix)
对无权图,顶点之间有弧标1,无弧标0;
对有权图,顶点之间有弧标权,无弧标无穷大;
2、邻接表(看书吧,精力有限不想画图了)
三、DFS与BFS
其实深度优先和广度优先,最重要的是要掌握其思想,而不是具体的实现,因为万变不离其宗。
1、DFS深度优先
①从v0出发访问v0
②找到刚访问过得顶点,访问其未访问过得邻接点中的一个。重复②直到不再有邻接点位置。
③回溯,返回前一个被访问过但是仍有未被访问过得邻接点的顶点,继续访问它的下一个邻接点。重复②直至完全遍历。
可能我描述的不够准确,但那也没有办法,应为有些东西真的是只能意会。学计算机必须要结合具体的例子来看。
原图:

DFS

其实简单来说:就是如果访问到的结点有邻接点就一直向下访问,否则就回溯。同树中的先根遍历很类似。
数据存储结构:
String[] vertex = new String[] {"v0","v1","v2","v3","v4","v5"};
int[][] matrix = new int[][] {
{0,1,0,1,0,0},
{1,0,1,0,1,0},
{0,1,0,0,0,0},
{1,0,0,0,0,1},
{0,1,0,0,0,0},
{0,0,0,1,0,0}
};
int[] visited = new int[6];//标记访问过得结点
递归实现:
void matrixDFS(int v0) {
System.out.print(vertex[v0] + " ");
visited[v0] = 1;
//遍历寻找v0的邻接点
for(int i = 0; i < vertex.length; i++) {
if(matrix[v0][i] == 1 && visited[i] == 0) {
matrixDFS(i);
}
}
}
非递归实现:
//基于栈的非递归实现
void matrixDFS1(int v0) {
Stack<Integer> stack = new Stack<Integer>();
stack.push(v0);
while(!stack.isEmpty()) {
int v = stack.pop();
if(visited[v] == 0) {//栈中很可能有重复的元素
System.out.print(vertex[v] + " ");
visited[v] = 1;
for(int i = 0; i < matrix.length; i++) {
if(matrix[v][i] == 1 && visited[i] == 0) {
stack.push(i);
}
}
}
}
}
2、BFS深度优先遍历
①访问v0
②访问v0所以未被访问过的邻接点
③分别以这些邻接点(②中的邻接点)出发,去访问他们的邻接点。重复③知道遍历结束。
BFS就比较像树中的层次遍历

代码实现:
void matrixBFS2(int v0) {
Queue<Integer> queue = new LinkedList<>();
queue.offer(v0);
while(!queue.isEmpty()) {
int v = queue.poll();
if(visited[v] == 0) {
System.out.print(vertex[v] + " ");
visited[v] = 1;
for(int i = 0; i < vertex.length; i++) {
if(matrix[v][i] == 1 && visited[i] == 0) {
queue.offer(i);
}
}
}
}
}
可以看到这段代码和DFS递归实现的代码差别只是一个用栈一个用队列。
DFS:访问v0,邻接点如栈
BFS:访问v0,邻接点入队
我们的目标不是要掌握这些具体的实现,而是理解DFS与BFS算法的思想,将其活学活用。
图的DFS与BFS遍历的更多相关文章
- 邻接矩阵实现图的存储,DFS,BFS遍历
图的遍历一般由两者方式:深度优先搜索(DFS),广度优先搜索(BFS),深度优先就是先访问完最深层次的数据元素,而BFS其实就是层次遍历,每一层每一层的遍历. 1.深度优先搜索(DFS) 我一贯习惯有 ...
- 图的DFS和BFS(邻接表)
用C++实现图的DFS和BFS(邻接表) 概述 图的储存方式有邻接矩阵和邻接表储存两种.由于邻接表的实现需要用到抽象数据结构里的链表,故稍微麻烦一些.C++自带的STL可以方便的实现List,使算 ...
- 图的DFS与BFS
图的DFS与BFS(C++) 概述 大一学生,作为我的第一篇Blog,准备记录一下图的基本操作:图的创建与遍历.请大佬多多包涵勿喷. 图可以采用邻接表,邻接矩阵,十字链表等多种储存结构进行储存,这里为 ...
- Java数据结构——图的DFS和BFS
1.图的DFS: 即Breadth First Search,深度优先搜索是从起始顶点开始,递归访问其所有邻近节点,比如A节点是其第一个邻近节点,而B节点又是A的一个邻近节点,则DFS访问A节点后再访 ...
- 列出连通集(DFS及BFS遍历图) -- 数据结构
题目: 7-1 列出连通集 (30 分) 给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N−1编号.进行搜索时,假设我们总是从编号最小的顶点出发,按编号递 ...
- [数据结构]图的DFS和BFS的两种实现方式
深度优先搜索 深度优先搜索,我们以无向图为例. 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似. 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发, ...
- 数据结构(11) -- 邻接表存储图的DFS和BFS
/////////////////////////////////////////////////////////////// //图的邻接表表示法以及DFS和BFS //////////////// ...
- 树的常见算法&图的DFS和BFS
树及二叉树: 树:(数据结构中常见的树) 树的定义
- 图、dfs、bfs
graphdfsbfs 1.clone graph2.copy list with random pointer3.topological sorting4.permutations5.subsets ...
随机推荐
- jQuery系列(四):jQuery的属性操作
jquery的属性操作模块分为四个部分:html属性操作,dom属性操作,类样式操作和值操作 html属性操作:是对html文档中的属性进行读取,设置和移除操作.比如attr().removeAttr ...
- 调用七牛云存储文件,返回url
文档地址:https://developer.qiniu.com/kodo/sdk/1283/javascript#2 npm引入 npm install qiniu-js 例子: var obser ...
- 利用django框架,手把手教你搭建数据可视化系统(一)
如何使用django去构建数据可视化的 web,可视化的结果可以呈现在web上. 使用django的MTV模型搭建网站 基础铺垫-MTV模型 Created with Raphaël 2.1.0Req ...
- BZOJ1070: [SCOI2007]修车(最小费用最大流,思维)
Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同 的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序, ...
- 【洛谷4542】 [ZJOI2011]营救皮卡丘(最小费用最大流)
传送门 洛谷 Solution 这是一道神仙题! 考虑这个东西是个啥. emmm,如果两个点要到达,一定不能经过比他们大的. 所以Floyd搞定两点距离然后费用流跑一遍就是答案了! 代码实现 /* m ...
- 手把手教你在Linux系统下安装MongoDB
1. 下载最新的stable版MongoDB [root@spirit-of-fire ~]# wget http://downloads.mongodb.org/linux/mongodb-linu ...
- ubuntu 安装eclipse for c++
linux的GUI和windos比起来实在逊色,虽然它的终端模式(命令行模式)非常强大.linux发行版ubuntu的GUI相对其他版本要华丽一些,所以最近由redhat转向ubuntu进行linux ...
- JVM源码分析之JDK8下的僵尸(无法回收)类加载器[z]
[z]http://lovestblog.cn/blog/2016/04/24/classloader-unload/ 概述 这篇文章基于最近在排查的一个问题,花了我们团队不少时间来排查这个问题,现象 ...
- Centos7.4 下cobbler安装及配置
1.背景介绍 作为运维,在公司经常遇到一些机械性重复工作要做,例如:为新机器装系统,一台两台机器装系统,可以用光盘.U盘等介质安装,1小时也完成了,但是如果有成百台的服务器还要用光盘.U盘去安装,就显 ...
- MYSQL理论学习
最近在复习数据库相关的知识,主要是以“SQL必知必会”这本书为参考,结合网上相关博客,记录学习的要点.本篇博客会持续更新,便于以后复习. 参考博客:http://blog4jimmy.com/2017 ...