一、图的基本概念

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遍历的更多相关文章

  1. 邻接矩阵实现图的存储,DFS,BFS遍历

    图的遍历一般由两者方式:深度优先搜索(DFS),广度优先搜索(BFS),深度优先就是先访问完最深层次的数据元素,而BFS其实就是层次遍历,每一层每一层的遍历. 1.深度优先搜索(DFS) 我一贯习惯有 ...

  2. 图的DFS和BFS(邻接表)

    用C++实现图的DFS和BFS(邻接表) 概述   图的储存方式有邻接矩阵和邻接表储存两种.由于邻接表的实现需要用到抽象数据结构里的链表,故稍微麻烦一些.C++自带的STL可以方便的实现List,使算 ...

  3. 图的DFS与BFS

    图的DFS与BFS(C++) 概述 大一学生,作为我的第一篇Blog,准备记录一下图的基本操作:图的创建与遍历.请大佬多多包涵勿喷. 图可以采用邻接表,邻接矩阵,十字链表等多种储存结构进行储存,这里为 ...

  4. Java数据结构——图的DFS和BFS

    1.图的DFS: 即Breadth First Search,深度优先搜索是从起始顶点开始,递归访问其所有邻近节点,比如A节点是其第一个邻近节点,而B节点又是A的一个邻近节点,则DFS访问A节点后再访 ...

  5. 列出连通集(DFS及BFS遍历图) -- 数据结构

    题目: 7-1 列出连通集 (30 分) 给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N−1编号.进行搜索时,假设我们总是从编号最小的顶点出发,按编号递 ...

  6. [数据结构]图的DFS和BFS的两种实现方式

    深度优先搜索 深度优先搜索,我们以无向图为例. 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似. 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发, ...

  7. 数据结构(11) -- 邻接表存储图的DFS和BFS

    /////////////////////////////////////////////////////////////// //图的邻接表表示法以及DFS和BFS //////////////// ...

  8. 树的常见算法&图的DFS和BFS

    树及二叉树: 树:(数据结构中常见的树) 树的定义

  9. 图、dfs、bfs

    graphdfsbfs 1.clone graph2.copy list with random pointer3.topological sorting4.permutations5.subsets ...

随机推荐

  1. js产生一个随机的字符串数字组合

    /** * 随机生成字符串 * @param randomFlag 产生任意长度随机字母数字组合 * @param min 任意长度最小位[固定位数] * @param max 任意长度最大位 * @ ...

  2. 浅谈C++运算符重载

    首先,什么是运算符重载? C++里运算符重载主要有两种方法.一是通过类的成员函数进行重载,二是通过类的友元函数进行重载. 下面以简单的复数类complex为例: 下面是通过类的成员函数进行运算符的重载 ...

  3. MySQL原理解析

    逻辑架构 MySQL逻辑架构整体分为三层: 客户端层,连接处理.授权认证.安全等功能均在这一层处理. 核心服务层,包括查询解析.分析.优化.缓存.内置函数(比如:时间.数学.加密等函数).所有的跨存储 ...

  4. 2016 Multi-University Training Contest 3 部分题解

    1001,只要枚举区间即可.签到题,要注意的是输入0的话也是“TAT”.不过今天补题的时候却WA了好几次,觉得奇怪.原来出现在判断条件那里,x是一个int64类型的变量,在进行(x<65536* ...

  5. 2016多校7.14 Warmup 题解

    先讲1007,是一个数位dp,询问一个区间内,各位数的和是一个素数的数字的个数.其实我并不会数位dp,这题直接套用了上次多校lyf队长的dp代码,改了点返回参数没想到直接AC了.代码如下: #incl ...

  6. Android学习——MediaProvider与Music模块

    一.MediaProvider数据库介绍 1. 关系型数据库 关系模型的物理表示是一个二维表格,由行和列组成. 2. MediaProvider数据库存储位置     /data/data/com.a ...

  7. 使用python播放音乐

    1.首先安装pygame,pip install pygame 2.上代码: import time import pygame #音乐路径 filepath=r"C:\Users\1473 ...

  8. SchedulerFactoryBean的问题

    http://blog.csdn.net/beliefer/article/details/51578546

  9. openapi and light-4j

    light-4j项目支持openapi规范,本文介绍一下参照相关demo做的上传功能. openapi.yaml,按照规范编写内容,/openapi/swagger可以查看对应的swagger页面,A ...

  10. DS博客作业07——查找

    1.本周学习总结 1.1思维导图 1.2.谈谈你对查找运算的认识及学习体会. 查找的内容和前两章树和图相比,要简单许多,在二次搜索树虽然也要用到树,但是也是很简单的树的操作,再加上查找的代码可以使用m ...