图的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 ...
随机推荐
- js产生一个随机的字符串数字组合
/** * 随机生成字符串 * @param randomFlag 产生任意长度随机字母数字组合 * @param min 任意长度最小位[固定位数] * @param max 任意长度最大位 * @ ...
- 浅谈C++运算符重载
首先,什么是运算符重载? C++里运算符重载主要有两种方法.一是通过类的成员函数进行重载,二是通过类的友元函数进行重载. 下面以简单的复数类complex为例: 下面是通过类的成员函数进行运算符的重载 ...
- MySQL原理解析
逻辑架构 MySQL逻辑架构整体分为三层: 客户端层,连接处理.授权认证.安全等功能均在这一层处理. 核心服务层,包括查询解析.分析.优化.缓存.内置函数(比如:时间.数学.加密等函数).所有的跨存储 ...
- 2016 Multi-University Training Contest 3 部分题解
1001,只要枚举区间即可.签到题,要注意的是输入0的话也是“TAT”.不过今天补题的时候却WA了好几次,觉得奇怪.原来出现在判断条件那里,x是一个int64类型的变量,在进行(x<65536* ...
- 2016多校7.14 Warmup 题解
先讲1007,是一个数位dp,询问一个区间内,各位数的和是一个素数的数字的个数.其实我并不会数位dp,这题直接套用了上次多校lyf队长的dp代码,改了点返回参数没想到直接AC了.代码如下: #incl ...
- Android学习——MediaProvider与Music模块
一.MediaProvider数据库介绍 1. 关系型数据库 关系模型的物理表示是一个二维表格,由行和列组成. 2. MediaProvider数据库存储位置 /data/data/com.a ...
- 使用python播放音乐
1.首先安装pygame,pip install pygame 2.上代码: import time import pygame #音乐路径 filepath=r"C:\Users\1473 ...
- SchedulerFactoryBean的问题
http://blog.csdn.net/beliefer/article/details/51578546
- openapi and light-4j
light-4j项目支持openapi规范,本文介绍一下参照相关demo做的上传功能. openapi.yaml,按照规范编写内容,/openapi/swagger可以查看对应的swagger页面,A ...
- DS博客作业07——查找
1.本周学习总结 1.1思维导图 1.2.谈谈你对查找运算的认识及学习体会. 查找的内容和前两章树和图相比,要简单许多,在二次搜索树虽然也要用到树,但是也是很简单的树的操作,再加上查找的代码可以使用m ...