非线性结构,图

图的概念(离散数学中学过)

图的定义和种类

定义

图是由顶点集V和弧集R构成的数据结构。

分类

(1)无向图

        若图中所有边都是不带方向的,则称该图是无向图。

(2)有向图

        若图中所有边都是有向的,则称该图是有向图。

(3)权、网或网络

        有些图中,边附带着一个称为权值的数据,这样的边称为加权边。若无向图(或有向图)的每条边(或弧)都带权,这样的图称为无向网(或有向网) 

相关术语

1. 顶点的度
顶点的度 (degree) 是指依附于某顶点 v 的边数,通常记为 TD(v) 。在有向图中,要区别

顶点的入度与出度的概念。顶点 v 的入度是指以顶点 v 为终点的弧的数目,记为 ID(v);顶

v 的出度是指以顶点 v 为始点的弧的数目,记为 OD(v) 。有 TD(v) = ID(v) + OD(v)
2. 路径和回路
无向图 G = (V E) 中从顶点 v 到顶点 v' 之间的路径 (path) 是一个顶点序列 (v = v i1
v i2 ,…,vim = v') ,其中, (v ij v ij+1 ) E 1 j m。路径上边或弧的数目称为路径长度。序列中顶点 不重复出现的路径称为简单路径。路径中第一个顶点和最后一个顶点相同时称该路径为回路或者环(cycle)。除第一个顶点与最后一个顶点之外,其他顶点不重复出现的回路称为简单回路,或者简单环。
3. 子图
对于图 G = (V E) G' = (V' E') ,若存在 V' V 的子集, E' E 的子集,则称图 G'
G 的一个子图。
4. 无向图的连通性
在无向图中,如果从一个顶点 v i 到另一个顶点 v j (i ≠ j) 有路径,则称顶点 v i v j 是连通
的。如果图中任意两顶点都是连通的,则称该图是连通图。如图 7.1 G 1 就是一个连通图。
无向图的极大连通子图称为连通分量。注意连通分量的概念,强调:
是子图;
子图要连通;
含有极大顶点数及依附于这些顶点的所有的边。
5. 有向图的连通性
对于有向图来说,若图中任意一对顶点 v i v j (i ≠ j) 均有从一个顶点 v i 到另一个顶点 v j
的路径,也有从 v j v i 的路径,则称该有向图是强连通图。有向图的极大强连通子图称为强
连通分量。
6. 生成树和生成森林
一个连通图的生成树是一个极小的连通子图,它包含有图中全部的顶点 n ,但只有足
以构成一棵树的 n - 1 条边。任一无向连通图最少存在一棵生成树。
一个有 n 个顶点的无向图最多有 ___ 条边。
n(n-1)/2
n 个顶点的连通图用邻接矩阵表示时,该矩阵至少有( ______ )个非零元 素。
2(n-1)

图的存储结构

考虑到图的信息包括两部分:顶点的信息、顶点之间的关系

邻接矩阵

 #define INFINITY <整数中允许的最大值>
 #define MAXNODE <图中顶点的最大个数>
 typedef char VertexType; /*假设顶点数据为字符型*/
 typedef struct
 { 
    int adj; /*图:若两顶点相邻则 adj=1,否则 adj=0;*/
     /*网:若两顶点相邻则 adj=wij,若 i=j 则 adj=0;否则 adj=∞ */
 } ArcType;
 typedef struct
 { 
    VertexType vertexs[MAXNODE];
    ArcType arcs[MAXNODE][MAXNODE]; /*邻接矩阵*/
    int vexnum, arcnum; /*图的顶点数和弧数*/
 } GraphType;

邻接表

 #define MAXNODE <图中顶点的最大个数>
 typedef struct arc
 {
     int adjvex; /*邻接点域,存储邻接点在表头结点表中的位置*/
     int weight; /*权值域,用于存储边或弧相关的信息,非网图可以不需要*/
     struct arc *next; /*链域,指向下一邻接点*/
 } ArcType; /*边表结点*/
 typedef struct
 {
     ElemType data; /*顶点信息*/
     ArcType *firstarc; /*指向第一条依附该顶点的边或弧的指针*/
 } VertexType; /*顶点表结点*/
 typedef struct
 { 
     VertexType vertexs[MAXNODE]; 
     int vexnum, arcnum; /*图中顶点数和弧数*/
 } AdjList;

图的基本操作

(1) 顶点定位操作 LocateVex(G v) :在图 G 中找到顶点 v ,返回该顶点在图中的位置。
(2) 取顶点操作 GetVextex(G v) :在图 G 中找到顶点 v ,并返回顶点 v 的相关信息。
(3) 求第一个邻接点操作 FirstAdjVex(G v) :在图 G 中,返回 v 的第一个邻接点。若
顶点 v G 中没有邻接顶点,则返回“空”。
(4) 求下一个邻接点操作 NextAdjVex(G v w) :在图 G 中,返回 v ( 相对于 w )
下一个邻接顶点。若 w v 的最后一个邻接点,则返回“空”。
(5) 插入顶点操作 InsertVex(G v) :在图 G 中增添新顶点 v
(6) 删除顶点操作 DeleteVex(G v) :在图 G 中,删除顶点 v 以及所有和顶点 v 相关联
的边或弧。
(7) 插入弧操作 InsertArc(G v w) :在图 G 中增添一条从顶点 v 到顶点 w 的边或弧。
(8) 删除弧操作 DeleteArc(G v w) :在图 G 中删除一条从顶点 v 到顶点 w 的边或弧。
(9) 深度优先遍历图 DFSTraverse(G v) :在图 G 中,从顶点 v 出发按深度优先对图中
每个结点访问一遍且仅一遍。
(10) 广度优先遍历图 BFSTraverse(G v) :在图 G 中,从顶点 v 出发按广度优先对图
中每个结点访问一遍且仅一遍。

图的遍历

深度优先遍历:一条路走到黑(每次找一个)

广度优先遍历:结交所有朋友(找所有)

图的应用

图的连通性问题

有向无环图及其应用-拓扑排序和关键路径

判定一个有向图是否存在回路除了可以利用拓扑排序方法外 , 还可以利用 _____________ 。
深度优先遍历算法

拓扑排序

在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。且该序列必须满足下面两个条件:

(1)每个顶点出现且只出现一次。
(2)若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。

有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说。

它是一个 DAG 图,那么如何写出它的拓扑排序呢?这里说一种比较常用的方法:

从 DAG 图中选择一个 没有前驱(即入度为0)的顶点并输出。
从图中删除该顶点和所有以它为起点的有向边。
重复 1 和 2 直到当前的 DAG 图为空或当前图中不存在无前驱的顶点为止。后一种情况说明有向图中必然存在环。

 

最短路径

AOE网络关键路径

完成整个工程所需的时间 取决于从源点到终点的 最长 路径长度, 这条路径 叫做 关键路径
(Critical Path)。 关键路径上的点称为 关键活动
找到关键找出 关键活动,将其按序连接起来,就可以得到 关键路径

最小生成树

prim算法

  1. 在一个加权连通图中,顶点集合V,边集合为E
  2. 任意选出一个点作为初始顶点,标记为book,计算所有与之相连接的点的距离,选择距离最短的,标记book.
  3. 重复以下操作,直到所有点都被标记为book
    在剩下的点钟,计算与已标记book点距离最小的点,标记book,证明加入了最小生成树。

 

Kruskal算法

首先,将每个顶点放入其自身的数据集合中。然后,按照权值的升序来选择边。当选择每条边时,判断定义边的顶点是否在不同的数据集中。如果是,将此边插入最小生成树的集合中,同时,将集合中包含每个顶点的联合体取出,如果不是,就移动到下一条边。重复这个过程直到所有的边都探查过。

  • 19
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值