图的相关操作


一、相关概念

1、图和树的区别是:树只有一个父节点,且两个顶点间的路径是唯一的。树是特殊的图
2、图是有顶点和边构成,其中边有方向,叫有向图,反之叫无向图。
3、完全图是指任意两个顶点都有一条边链接,其中边有方向,叫有向图,反之为无向图。
如果有n个顶点,那么无向完全图的边的个数是(n-1)n/2;有向完全图边的个数是(n-1)n
4、图还可以分为稀疏图和稠密图
5、网:图中各个边具有权重,此时这个图就是网
6、顶点的度:与该顶点相关联的边的数目,记为TD(v)
在有向图中顶点的度等于这个顶点的入度和出度之和
入度:以v为终点的有向边的条数,记为ID(v)
出度:以v为始点的有向边的条数,记为OD(v)
7、路径:接续的边构成的顶点序列

for an example:

在这里插入图片描述

那么1->4的路径是:1->3->4

8、路径的长度:路径上边或弧的数目/权值之和
9、回路(环):第一个顶点和最后一个顶点相同的路径
10、简单路径:除路径起点2和终点相同,其余顶点均不相同的路径
在这里插入图片描述

11、连通图:在无(有)向图G={V,{E}}中,若对任何两个顶点v,u都存在从v到u的路径,则称G是连通图
对于有向图,连通图还可以分为强连通图和非强连通图
在这里插入图片描述
12、权与网
图中边或弧所具有的相关数称为权;边带权值的图叫网
13、子图
在这里插入图片描述
14、连通分量(强连通分量)
无向图G的极大连通子图称为G的连通分量。
注意:
极大连通子图的意思是:该子图是G的连通子图,将G的任何不在该子图中的顶点加入,子图不再连通
比如:
下面的非连通图可分为两个连通图,这两个连通图叫做连通分量

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


二、图的存储形式

在这里插入图片描述

1.无向图邻接表的存储形式

邻接表有两种存储方式:数组和链式
1、数组
(1)、邻接表是一个二维数组,如果结点i和结点j有边,那么,对应下表(i,j)和(j,i)就为1,反之为0;

(2)、邻接表的特点:
1)对角线全为0;
2)为对称矩阵
3)顶点i的度等于第i行1的个数
4)完全图的邻接表,除对角线为0外,全为1

(3)、邻接表的c++存储形式

struct GraphNode
{
	vector<int> vertex;
	vector<vector<int>> edge;
};

2 链表
在这里插入图片描述
代码表示为

struct GraphNode
{
	vector<int> vertex;
	List< GraphNode > edge;
};

2. 有向图邻接表的存储形式

1 数组
有向图邻接表也是二维数组,但是当顶点i指向顶点j时,那么(i,j)为1,即这个邻接表不是对称的

特点:
1)顶点i的入度等于第i行的1的个数
2)顶点i的出度等于第i列的1的个数

2 链表
链表的存储方式有两种,一种是邻接表,另一种是逆邻接表分别对应的是出度和入度两种方式。如下图表示
具体代码和无向图基本一致
在这里插入图片描述
3、网的邻接表是一个二维数组,但是当顶点i指向顶点j时,那么(i,j)为权重。
可以看出,网的邻接表和有向图的邻接表的区别在于存储的内容不一样

3. 邻接表的存储形式的缺点

邻接表存储有其缺点,针对邻接表存储缺点,对于有向图存储可以变为十字链表存储;对于无向图存储可以变为邻接多重表存储
在这里插入图片描述

4. 十字链表存储形式

十字链表是有向图的另一种链式存储结构。我们也可以把它看成是将有向图的邻接表和逆邻接表结合起来形成的一种链表。

有向图中的每一条弧对应十字链表中的一个弧结点,同时有向图中每个顶点在十字链表中对应有一个结点,叫做顶点结点

下面是一个十字链表的例子

在这里插入图片描述

4. 邻接多重表存储形式

在这里插入图片描述

三、生成树

1、定义:

所有顶点均由边连接起来,但不存在回路的图

注意:
1)一个图可以生成许多棵不同的生成树
2)所有生成树具有以下共同特点:
(1)生成树的顶点个数和图的顶点个数相同
(2)生成树是图的最小连通子图,去掉一条边计非连通

在这里插入图片描述

2、生成树的方式

图的生成树的生成方式分为两种:深度优先和广度优先。两种生成树的结果如下图所示

在这里插入图片描述

3、最小生成树

1、定义:
给定一个无向网,在该网的所有生成树中,使得各边权值之和最小的那颗生成树即为该网的最小生成树,又叫做最小代价树。

例子如下:
在这里插入图片描述

4.最小生成树构建

使用MST性质构建最小生成树
MST性质为:
设N=(V,E)是一个连通网,U是顶点集V的一个非空子集。若边(u,v)是一条具有最小权值的边,其中u属于U,v属于V-U,则必存在一颗包含(u,v)的最小生成树

比如,如下图
在这里插入图片描述
其中的U集合为v1;V-U的集合是v2,v3,v4,v5,v6;在和v1相通的边中,v1-v3的边的权重最小,即这条边就存在在最小生成子树中

5.最小生成树构建算法:普利姆(Prim)算法

在这里插入图片描述
时间复杂度为:O(n^2);其中n是顶点的数目,比较适合稠密图的最小生成树构建

5.最小生成树构建算法:克鲁斯卡尔(Kruskal)算法

在这里插入图片描述
时间复杂度为:O(elog(e));其中e是边的数目,比较适合稀疏图的最小生成树构建

6.最小生成树构建算法对比

1、Prim算法是先选择顶点,然后在顶点附近选择权重最小的边
2、Kruskal算法是先选择权重最小的边,根据边连接顶点
3、Prim适合稠密图的最小生成树生成;但是Kruskal算法适合稀疏图的最小生成树生成


四、图的最小路径生成

最短路径问题可以抽象为有向网问题,其中顶点表示的是目的地,弧表示的是路径长度。
最短路径问题可分为两类,并分别有两种求解算法:
1)单源最短路径:->Dijkstra(迪杰斯特拉)算法
2)所有顶点间的最短路径->Floyd(弗洛伊德)算法

1.图的最小路径生成生成算法:Dijkstra算法

在这里插入图片描述
这种算法的复杂度是O(n^2)

例子
在这里插入图片描述
如果是用Dijkstra算法求解每个顶点到另一个顶点的最小路径,此时又多了一次遍历,这时时间复杂度是O(n^3)

2.图的最小路径生成生成算法:Floyd算法

在这里插入图片描述

例子
在这里插入图片描述

五、图的拓扑排序

1. 有向无环图的概念

1、DAG图:有向无环图又叫做DAG图
2、AOV网:用一个有向图表示一个工程的各子工程及其相互制约的关系,其中以顶点表示活动,弧表示活动之间的优先制约关系,这种有向图为顶点表示活动的网,即AOV网
在这里插入图片描述

3、AOE网:用一个有向图表示一个工程的各子工程以及其相互制约关系,以弧表示活动,以顶点表示活动的开始或者结束时间,称这种有向图为边表示活动的网,称为AOE网

2. 拓扑排序

1、原理
在AOV网没有回路的前提下,会将全部的序列排列成一个线性序列,使得若AOV网中有弧<i,j>存在,则在这个序列中,i一定排列在j的前面,具有这种性质的线性序列称为拓扑有序序列,相应的拓扑有序排序叫做拓扑排序
2、方法
每次都将网中的无输入顶点插入进存储表中,并将该顶点与其相关连点间的边删除。不断重复这个过程,获得拓扑排序
3、应用
判断是否为有环图。
如果经过拓扑排序后的顶点表和总顶点表的顶点相同,即为无环有向图,反之为有环有向图

3. 关键路径

1、AOE网中顶点表示事件,弧表示活动活动,弧的加权表示活动持续时间
其中事件表示它之前的活动已经完成,在它之后的活动可以开始
2、关键路径的描述量
1) ve(vj)表示的是第vj(顶点)个事件的最早发生时间
2) vl(vj)表示的是事件vj的最迟发生事件
3) e(i)表示活动ai(弧)最早发生时间
4) l(i)表示活动ai的最晚开始时间
5) l(i) - e(i)表示的是完成活动ai的时间余量
6) 关键活动即关键路径活动,对应的数学模型是 l(i) == e(i),即时间余量为0

3、如何找关键活动

在这里插入图片描述
图示解释+例子如下:

在这里插入图片描述
在这里插入图片描述
4、关键路径讨论
1)若网中有几条关键路径,则需要加快同时在几条关键路径上的关键活动,如上面的例子中的a11, a10,a8, a7
2)如果一个活动处于所有的关键路径上,那么提高这个活动的速度,就能缩短整个工程的完成时间,比如上面例子的a1,a4(选择这两个弧是因为上面例子有两个关键路径:a1->a4->a7->a10和a1->a4->a8->a11;这两条关键路径都经过a1和a4)
3)处于所有关键路径上的活动完成时间不能缩短太多,否则会使原来的关键路径不是关键路径。这时需要重新选择关键路径(比如如果a1从6变为3,那么就出问题了)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值