如何实现图的BFS和DFS

图的存储结构

本文的重点在于图的深度优先搜索(DFS)和广度优先搜索(BFS),因此不再对图的基本概念做过多的介绍,但是要先大致了解下图的几种常见的存储结构。

邻接矩阵

邻接矩阵既可以用来存储无向图,也可以用来存储有向图。该结构实际上就是用一个二维数组(邻接矩阵)来存储顶点的信息和顶点之间的关系(有向图的弧或无向图的边)。其描述形式如下:

//图的邻接矩阵存储表示
#define MAX_NUM 20 // 最大顶点个数
enum GraphKind{GY,GN}; // {有向图,无向图}
typedef struct
{
   VRType adj; // 顶点关系类型。对无权图,用1(是)或0(否)表示是否相邻;对带权图,则为权值
   InfoType *info; // 与该弧或边相关信息的指针(可无)
}ArcCell,AdjMatrix[MAX_NUM][MAX_NUM]; // 二维数组
typedef struct
{
   VertexType vexs[MAX_NUM]; // 顶点向量
   AdjMatrix arcs; // 邻接矩阵
   int vexnum,arcnum; // 图的当前顶点数和弧(边)数
   GraphKind kind; // 图的种类标志
}Graph;

我们分别看下面两个图,左边为有向图,右边为无向图

           

上面两个图均为无权图,我们假设存储的时候,V0的序号为0,V1的序号为1,V2的序号为2。。。,且adj为1表示两顶点间没有没有连接,为0时表示有连接。则有向图的邻接矩阵如下图左边的矩阵所示,无向图的邻接矩阵如下图右边的矩阵所示;

       

根据邻接矩阵很容易判断图中任意两个顶点之间连通与否,并可以求出各个顶点的度。

1、对于无向图,观察右边的矩阵,发现顶点Vi的度即是邻接矩阵中第i行(或第i列)的元素之和。

2、对于有向图,由于需要分别计算出度和入读,观察左边的矩阵,发现顶点Vi的出度即为邻接矩阵第i行元素之和,入度即为邻接矩阵第i列元素之和,因此顶点Vi的度即为邻接矩阵中第i行元素和第i列元素之和。

很明显,邻接矩阵所占用的存储空间与图的边数或弧数无关,因此适用于边数或弧数较多的稠密图。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索存储
, 矩阵
, 无向图 邻接表数
, 图的基本操作
, 有向图
, 元素
, 顶点
, 相邻矩阵
, 无向图的深度遍历
, 移动bfs搜索
, 矩阵dfs算法
, 二维
二维矩阵
dfs bfs进行图的遍历、dfs和bfs、dfs bfs、dfs和bfs的区别、dfs与bfs,以便于您获取更多的相关知识。

时间: 2024-12-31 19:29:01

如何实现图的BFS和DFS的相关文章

用BFS和DFS解决圆盘状态搜索问题

人工智能课程的实验(我的解法其实更像是算法课程的实验) 用到的算法:深度优先搜索.宽度优先搜索(状态扩展的不同策略) 数据结构:表示状态的结构体.多维数组 (可能是最近做算法竞赛题的影响,这次并不像以前那样依赖类和面向对象了,而是用最简单(几乎没有封装)的数据表示方法和大量的全局变量来存储数据,用面向过程的写法,以快速解决某一问题为目的设计程序.安全性和可扩展性势必降低,有些技巧的使用也让代码变得难懂:但是代码简洁,节省运行的时间和空间开销,这应该就是算法竞赛更加看重的吧) 这次用了C++写了控

poj 1724ROADS(bfs和dfs做法)

/* dfs比较好想,就是测试数据的问题,导致在遍历边的时候要倒着遍历才过! */ #include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<algorithm> #define Max 0x3f3f3f3f using namespace std; struct node{ int D; int L, T; node(int D, int L,

BFS和DFS的路径输出

DFS 其实就是一直顺着一个方向不断的搜索直到找到了目标为止.路径输出的时候,利用记录前面的点即可. 举例: #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; #define N 9 int cnt; struct Point{ int x; int y; }path[N*N]; int maze[N][N];/*保存地

[干货,阅后进BAT不是梦]面试心得与总结---BAT、网易、蘑菇街

本文转载自:公众号:JANiubility 前言 之前实习的时候就想着写一篇面经,后来忙就给忘了,现在找完工作了,也是该静下心总结一下走过的路程了,我全盘托出,奉上这篇诚意之作,希望能给未来找工作的人一点指引和总结, 也希望能使大家少走点弯路 , 如果能耐心读完,相信对你会找到你需要的东西. 先说一下LZ的基本情况,LZ是四川某985学校通信专业的研究生(非计算机),大学阶段也就学了C语言,根本没想过最后要成为码农.大四才开始学java,研一下开始学android,所以LZ觉得自己开始就是一个小

【算法导论】图的深度优先搜索遍历(DFS)

        关于图的存储在上一篇文章中已经讲述,在这里不在赘述.下面我们介绍图的深度优先搜索遍历(DFS).         深度优先搜索遍历实在访问了顶点vi后,访问vi的一个邻接点vj:访问vj之后,又访问vj的一个邻接点,依次类推,尽可能向纵深方向搜索,所以称为深度优先搜索遍历.显然这种搜索方法具有递归的性质.图的BFS和树的搜索遍历很类似,只是其存储方式不同.         其基本思想为:从图中某一顶点vi出发,访问此顶点,并进行标记,然后依次搜索vi的每个邻接点vj:若vj未被访

图论中DFS与BFS的区别、用法、详解?

  DFS与BFS的区别.用法.详解? 写在最前的三点: 1.所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次. 2.实现bfs和dfs都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵和邻接表.这里为简单起 见,均采用邻接矩阵存储,说白了也就是二维数组. 3.本文章的小测试部分的测试实例是下图:   一.深度优先搜索遍历 1.从顶点v出发深度遍历图G的算法 ① 访问v ② 依次从顶点v未被访问的邻接点出发深度遍历. 2.一点心得:dfs算法最大特色就在于其递归特性,使得算法代

uva 11198 - Dancing Digits 隐式图 bfs

    求最少次数,一般就是bfs或者dfs或者数学公式,这题用bfs加上hash很好写.     因为比较懒,就用了string类型,于是多出char和string的转换,浪费了很多时间,1.416s才过.     写hash时不要忘记加绝对值 /* author:jxy lang:C/C++ university:China,Xidian University **If you need to reprint,please indicate the source** */ #include

c++-关于bfs,dfs的两种实现方法的区别

问题描述 关于bfs,dfs的两种实现方法的区别 这两个算法可以用递归实现,也可以用open表close表实现,这两种实现方法有什么区别呢?或者说哪个更好更便于实现呢? 解决方案 基于邻接矩阵和邻接表的两种方法实现无向图的BFS和DFS创建线程的两种方法,及之间的区别java中实现多线程的两种方法的区别 解决方案二: http://blog.csdn.net/lxpaopao/article/details/44806381

UVa 10603:Fill,经典倒水问题+隐式图搜索+dfs

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=110&page=show_problem&problem=1544 类型: 隐式图搜索 原题: There are three jugs with a volume of a, b and c liters. (a, b, and c are positive integers not greater th