数据结构和算法系列17 图

阅读目录

  • 一,图的定义
  • 二,图相关的概念和术语
  • 三,图的创建和遍历
  • 四,最小生成树和最短路径
  • 五,算法实现

这一篇我们要总结的是图(Graph),图可能比我们之前学习的线性结构和树形结构都要复杂,不过没有关系,我们一点一点地来总结,那么关于图我想从以下几点进行总结:

1,图的定义?

2,图相关的概念和术语?

3,图的创建和遍历?

4,最小生成树和最短路径?

5,算法实现?

回到顶部

一,图的定义

什么是图呢?

图是一种复杂的非线性结构。

在线性结构中,数据元素之间满足唯一的线性关系,每个数据元素(除第一个和最后一个外)只有一个直接前趋和一个直接后继;

在树形结构中,数据元素之间有着明显的层次关系,并且每个数据元素只与上一层中的一个元素(双亲节点)及下一层的多个元素(孩子节点)相关;

而在图形结构中,节点之间的关系是任意的,图中任意两个数据元素之间都有可能相关。

图G由两个集合V(顶点Vertex)和E(边Edge)组成,定义为G=(V,E)

回到顶部

二,图相关的概念和术语

1,无向图和有向图

对于一个图,若每条边都是没有方向的,则称该图为无向图。图示如下:

因此,(Vi,Vj)和(Vj,Vi)表示的是同一条边。注意,无向图是用小括号,而下面介绍的有向图是用尖括号。

无向图的顶点集和边集分别表示为:

V(G)={V1,V2,V3,V4,V5}

E(G)={(V1,V2),(V1,V4),(V2,V3),(V2,V5),(V3,V4),(V3,V5),(V4,V5)}

对于一个图G,若每条边都是有方向的,则称该图为有向图。图示如下。

因此,<Vi,Vj>和<Vj,Vi>是两条不同的有向边。注意,有向边又称为弧。

有向图的顶点集和边集分别表示为:

V(G)={V1,V2,V3}

E(G)={<V1,V2>,<V2,V3>,<V3,V1>,<V1,V3>}

2,无向完全图和有向完全图

我们将具有n(n-1)/2条边的无向图称为无向完全图。同理,将具有n(n-1)条边的有向图称为有向完全图。

3,顶点的度

对于无向图,顶点的度表示以该顶点作为一个端点的边的数目。比如,图(a)无向图中顶点V3的度D(V3)=3

对于有向图,顶点的度分为入度和出度。入度表示以该顶点为终点的入边数目,出度是以该顶点为起点的出边数目,该顶点的度等于其入度和出度之和。比如,顶点V1的入度ID(V1)=1,出度OD(V1)=2,所以D(V1)=ID(V1)+OD(V1)=1+2=3

记住,不管是无向图还是有向图,顶点数n,边数e和顶点的度数有如下关系:

因此,就拿有向图(b)来举例,由公式可以得到图G的边数e=(D(V1)+D(V2)+D(V3))/2=(3+2+3)/2=4

4,子图

故名思义,这个就不解释了。

5,路径,路径长度和回路

路径,比如在无向图G中,存在一个顶点序列Vp,Vi1,Vi2,Vi3…,Vim,Vq,使得(Vp,Vi1),(Vi1,Vi2),…,(Vim,Vq)均属于边集E(G),则称顶点Vp到Vq存在一条路径。

路径长度,是指一条路径上经过的边的数量。

回路,指一条路径的起点和终点为同一个顶点。

6,连通图(无向图)

连通图是指图G中任意两个顶点Vi和Vj都连通,则称为连通图。比如图(b)就是连通图。下面是一个非连通图的例子。

上图中,因为V5和V6是单独的,所以是非连通图。

7,强连通图(有向图)

强连通图是对于有向图而言的,与无向图的连通图类似。

8,网

带”权值”的连通图称为网。如图所示。

回到顶部

三,图的创建和遍历

1,图的两种存储结构

1) 邻接矩阵,原理就是用两个数组,一个数组保存顶点集,一个数组保存边集。下面的算法实现里边我们也是采用这种存储结构。如下图所示:

2) 邻接表,邻接表是图的一种链式存储结构。这种存储结构类似于树的孩子链表。对于图G中每个顶点Vi,把所有邻接于Vi的顶点Vj链成一个单链表,这个单链表称为顶点Vi的邻接表。

2,图的两种遍历方法

1) 深度优先搜索遍历

深度优先搜索DFS遍历类似于树的前序遍历。其基本思路是:

a) 假设初始状态是图中所有顶点都未曾访问过,则可从图G中任意一顶点v为初始出发点,首先访问出发点v,并将其标记为已访问过。

b) 然后依次从v出发搜索v的每个邻接点w,若w未曾访问过,则以w作为新的出发点出发,继续进行深度优先遍历,直到图中所有和v有路径相通的顶点都被访问到。

c) 若此时图中仍有顶点未被访问,则另选一个未曾访问的顶点作为起点,重复上述步骤,直到图中所有顶点都被访问到为止。

图示如下:

注:红色数字代表遍历的先后顺序,所以图(e)无向图的深度优先遍历的顶点访问序列为:V0,V1,V2,V5,V4,V6,V3,V7,V8

如果采用邻接矩阵存储,则时间复杂度为O(n2);当采用邻接表时时间复杂度为O(n+e)。

2) 广度优先搜索遍历

广度优先搜索遍历BFS类似于树的按层次遍历。其基本思路是:

a) 首先访问出发点Vi

b) 接着依次访问Vi的所有未被访问过的邻接点Vi1,Vi2,Vi3,…,Vit并均标记为已访问过。

c) 然后再按照Vi1,Vi2,… ,Vit的次序,访问每一个顶点的所有未曾访问过的顶点并均标记为已访问过,依此类推,直到图中所有和初始出发点Vi有路径相通的顶点都被访问过为止。

图示如下:

因此,图(f)采用广义优先搜索遍历以V0为出发点的顶点序列为:V0,V1,V3,V4,V2,V6,V8,V5,V7

如果采用邻接矩阵存储,则时间复杂度为O(n2),若采用邻接表,则时间复杂度为O(n+e)。

回到顶部

四,最小生成树和最短路径

1,最小生成树

什么是最小生成树呢?在弄清什么是最小生成树之前,我们需要弄清什么是生成树?

用一句语简单概括生成树就是:生成树是将图中所有顶点以最少的边连通的子图。

比如图(g)可以同时得到两个生成树图(h)和图(i)

知道了什么是生成树之后,我们就很容易理解什么是最小生成树了。所谓最小生成树,用一句话总结就是:权值和最小的生成树就是最小生成树。

比如上图中的两个生成树,生成树1和生成树2,生成树1的权值和为:12,生成树2的权值为:14,我们可以证明图(h)生成树1就是图(g)的最小生成树。

那么如何构造最小生成树呢?可以使用普里姆算法。

2,最短路径

求最短路径也就是求最短路径长度。下面是一个带权值的有向图,表格中分别列出了顶点V1其它各顶点的最短路径长度。

源点 最短路径 终点   路径长度
V1 V1,V3,V2 V2 中转 5
V1 V1,V3 V3 直达 3
V1 V1,V3,V2,V4 V4 中转 10
V1 V1,V3,V5 V5 中转 18

表:顶点V1到其它各顶点的最短路径表

从图中可以看出,顶点V1到V4的路径有3条(V1,V2,V4),(V1,V4),(V1,V3,V2,V4),其路径长度分别为15,20和10,因此,V1到V4的最短路径为(V1,V3,V2,V4)。

那么如何求带权有向图的最短路径长度呢?可以使用迪杰斯特拉(Dijkstra)算法。

回到顶部

«

转载于:https://www.cnblogs.com/chuninggao/p/7340871.html

图的遍历、最小生成树、最短路径相关推荐

  1. 数据结构-图-Java实现:有向图 图存储(邻接矩阵),最小生成树,广度深度遍历,图的连通性,最短路径1...

    import java.util.ArrayList; import java.util.List; // 模块E public class AdjMatrixGraph<E> { pro ...

  2. 数据结构—图(Part Ⅱ)—最小生成树 最短路径

    目录 最小生成树 普里姆(Prim)算法 算法实现 运行结果 程序分析 克鲁斯卡尔(Kruskal)算法 算法实现 运行结果 程序分析 最短路径 广度优先搜索(BFS)算法 算法实现 运行结果 程序分 ...

  3. 数据结构之图(最小生成树+最短路径)

    基本概念 连通:若a->b存在路径,即为连通 连通图:该图中任意两点均连通,即为连通图 连通分量:下图为无向图,但存在三个连通分量 强连通图:双向的连通图 强连通分量:有向图中的双向连通 图的存 ...

  4. 网状结构(图)图的存储(邻接矩阵、邻接表)、图的遍历(深度DFS、广度BFS)、图的最短路径

    图 多对多关系 是一种网状数据结构,图是由非空的顶点集合和一个描述顶点之间关系的集合组成 其定义 Graph = (V, E) V={x | x ∈某个数据对象} E = {<u, v> ...

  5. 数据结构(12)----图(遍历、最小生成树、easyX可视化)

    从图的某一顶点出发访问遍图中其余顶点,且使每一个顶点仅被访问一次,这一过程就叫做图的遍历(Traversing Graph). 深度优先遍历(Depth_Frist_Search),也有称为深度优先搜 ...

  6. Java数据结构与算法:无向图,有向图,带权图,图的遍历,最小生成树

    文章目录 无向图 有向图 带权图 图的遍历 广度优先遍历 深度优先遍历 最小生成树 无向图 前面了解到树是有单一根结点的非线性结构,图(graph)也是一种非线性结构,其中的结点可以与许多其他的结点相 ...

  7. Python算法学习[5]—图、遍历、连通、最短路径代码演练

    图.遍历.连通.最短路径&代码演练 图是计算机科学中的一种数据结构,它由节点(顶点)和边组成.在实际应用中,图经常被用来表示复杂系统之间的关系,如社交网络.交通网络等.本文将介绍图的基本概念和 ...

  8. 图的遍历 --- 广度优先搜索【借助队列实现】 + 深度优先搜索【借助递归栈】

    1. >>图的遍历是指从图中的某一顶点出发,按照某种搜索方法沿着图中的边对图中的所有顶点访问 一次且仅访问一次. 注意:树是一种特殊的图,所以树的遍历实际上也可以看作是一种特殊的图的遍历. ...

  9. c语言的标志数组图的遍历,天津商业大学-计算机科学与技术专业-高职升本-课件5...

    <天津商业大学-计算机科学与技术专业-高职升本-课件5>由会员分享,可在线阅读,更多相关<天津商业大学-计算机科学与技术专业-高职升本-课件5(37页珍藏版)>请在人人文库网上 ...

最新文章

  1. c# 线程间操作无效: 从不是创建控件“”的线程访问它,用托管来解决
  2. android弹窗不能手动关闭_3大类APP弹窗提醒方式总结
  3. linux获取打开串口失败的原因,linux – 从串口读取失败
  4. POJ NOI0105-44 第n小的质数
  5. Bulma CSS框架教程
  6. 1.定义一个基类 Base,有两个公有成员函数fn1( ),fn2 ( )。 私有派生出Derived类,如何通过Derived 类的对象调用基类的函数fnl() ?
  7. cygwin安装linux教程,cygwin安装教程 cygwin安装使用方法
  8. 人脸识别门禁应用方案
  9. 谁谋杀了我们的游戏?转自 斗战神制作人-Yocar
  10. 中国网游未来发展方向预测
  11. python3爬虫下载音乐_python3.4爬虫批量下载音乐
  12. 1、关于百兆口、千兆口、万兆口端口和网线的小常识
  13. 最近邻算法(KNN算法)
  14. zookeeper数据迁移
  15. 外网电脑配置8G运行内存,运行Android Studio,速度很轻松
  16. 推荐系统CTR(CVR)预估模型(多任务学习)之ESMM
  17. 网络基础-IP、端口等
  18. 量化投资学习——汇率套利策略
  19. 利用js实现轮播图(上一张,下一张,选取第几张,动画等)
  20. 施乐5065服务器显示FF,(转)施乐6550/7500/5065彩机部份代码

热门文章

  1. Win下执行Swing程序的BAT文件 和 Linux下执行Swing程序的SH文件
  2. 图像的熵、灰度平均值、灰度中值、方差
  3. telnet/ftp/netstat/ping命令詳細介紹
  4. YFIOServer 后台IO接口使用说明
  5. 抗炎饮食与混合坚果粉
  6. com.alibaba.fastjson.JSONException: not close json text, token : :
  7. SQL validation failed.Column ‘content‘ not found in any table
  8. flink on yarn模式出现The main method caused an error: Could not deploy Yarn job cluster问题排查+解决
  9. kaggle notebook在git push时附带用户民和密码(一行搞定,全部写在一行中)
  10. 第六章插图以及代码文件和插图之间的对应关系