图和图的应用


定义:图是由顶点集V和顶点间的关系集合E(边的集合)组成的一种数据结构,可以用二元组定义为:G=(V,E)

术语:

有向图和无向图:在图中,若用箭头标明了边是由方向性的,则为有向图,否则称为无向图。

完全图:具有n个顶点,n(n-1)/2条边的图,称为完全无向图。具有n个顶点,n(n-1)条弧的有向图,称为完全有向图,两者都称为完全图。

稠密图:边数多于完全图的一半

稀疏图:边数少于完全图的一半

度:一个顶点依附的边或弧的数目,称为该顶点的度。等于该顶点的入度和出度之和。

入度:一个顶点依附的弧头数目,称为该顶点的入度

出度:一个顶点依附的弧尾数目,称为该顶点的出度


图的存储结构


图的邻接矩阵表示:

从无向图的邻接矩阵中可以得出如下结论:

  1. 邻接矩阵是对称的
  2. 第i行或第i列1的个数为顶点i的度
  3. 矩阵中1的个数的一半为图中边的数目
  4. 顶点i和j相连看i行j列值是否为1

从有向图的邻接矩阵可以得出如下结论:

  1. 矩阵不一定是对称的
  2. 第i行中1的个数为顶点i的出度
  3. 第i列中1的个数为顶点i的入度
  4. 矩阵中1的个数为图中弧的数目
  5. 很容易判断顶点i和顶点j是否有弧相连

网的邻接矩阵表示:


邻接表:

从无向图的邻接表可以得到如下结论:

  1. 第i个链表中结点数目为顶点i的度
  2. 所有链表中结点数目的一半为图中边数
  3. 占用的存储单元数目为n+2e

从有向图的邻接表可以得到如下结论:

第i个链表中结点数目为顶点i的出度

所有链表中结点数目为图中弧数

占用的存储单元数目为n+e


图的遍历


定义:从图中某一顶点出发访遍图中其余顶点,且使每个顶点仅被访问一次

两条遍历图的路径:深度优先搜索(栈)、广度优先搜索(队列)

深度优先搜索遍历:

  1. 首先访问顶点i,并将其访问标记置为访问过,即Visited[i]=1;
  2. 然后搜索与顶点i有边相连的下一个顶点j,若j未被访问过,则访问它,并将j的访问标记置为访问过,即Visited[j]=1,然后从j开始重复此过程,若j已访问,再看与i有边相邻的其他顶点
  3. 若与i有边相连的顶点都被访问过,则退回到前一个访问顶点重复刚才过程,直到图中所有顶点都被访问完为止。

广度优先搜索遍历:

  1. 开始时要将其置空
  2. 在每访问一个顶点时,要将其入队
  3. 在访问一个顶点的所有后继时,要将其出队
  4. 若队列为空时,说明每一个访问过的所有后继均已访问过。因而本次遍历结束。若此时还有未访问的顶点,需要另选起点进行遍历。

生成树和最小生成树


生成树:

在图论中,常常将树定义为一个无回路连通图。

最小生成树:

若生成树中每条边上权值之和达到最小,称为最小生成树。

普利姆(prim)算法:

在图中任取一个顶点K作为开始点,另U={k},W=V-U,其中V为图中所有顶点集,然后找一个顶点在U中,另一个顶点在W中的边中最短的一条,找到后,将该边作为最小生成树的树边保存起来,并将该边顶点全部加入U集合中,并从W中删去这些顶点,然后重新调整U中顶点到W中顶点的距离,使之保持最小,再重复此过程,直到W为空集为止。

克鲁斯卡尔算法:

将图中所有边按权值递增顺序排列,依次选取权值较小的边,但要求后面选取的边不能与前面选取的边构成回路,若构成回路,则放弃该条边,再去选后面权值较大的边,n个顶点的图中,选够n-1条边即可。


最短路径


单源点最短路径:给定一个出发点(单源点)和一个有向网G=<V,E>,求出源点到其他各个顶点之间的最短路径

迪杰斯特拉()算法:设置并逐步扩充一个集合S,存放已求出其最短路径的顶点,则尚未确定最短路径的顶点集合是V-S,其中V为网中所有顶点集合。按最短路径长度递增的顺序逐个以V-S中的顶点加到S中,直到S中包含全部顶点,而V-S为空。

顶点对之间的最短路径:对于给定的有向网G=<V,E>,要对G中任意一对顶点有序对V\W(V!=W),找出V到W的最短距离和W到V的最短距离。

解决此问题的一个有效方法是:轮流以每一个顶点为源点,重复执行迪杰斯特拉算法n次。即可求得每一对顶点之间的最短路径,总的时间复杂度为O(n^{3}

弗洛伊德算法:


拓扑排序


实现步骤:

  1. 在AOV网中选一个入度为0的顶点且输出之
  2. 从AOV网中删除此顶点及该顶点发出来的所有有向边
  3. 重复12两步,直到AOV网中所有顶点都被输出或网中不存在入度为0的顶点

因此,对给定的AOV网,应先判断它是否存在有向环。判断的方法是对该AOV网进行拓扑排序,将AOV网中的顶点排成一个线性有序序列,若该线性序列中包含AOV网全部顶点,则AOV网无环。否则,AOV网中存在有向环,该AOV网所代表的工程是不行的。


关键路径


若以带权有向图的顶点代表事件,或工程进展状态,用弧表示活动,弧上的权值表示完成该活动所需要的时间,则这样的带权有向图称为AOE网(Activity ON Edge Network)

源点:网中只有一个入度为零的点

汇点:只有一个出度为零的点

路径:由源点经由一系列顶点到达汇点所经过的有向边组成(无回路),注意:路径可以有多条。

路径长度:组成路径的各有向边上活动所需时间之和。

最长路径长度:时间之和最大的路径——即完成整个工程所需的时间,这是因为所有活动完成之后,即在这条最长路径上的所有活动完成之后,才能完成整个工程。

关键路径:将具有最长路径长度的路径就称为关键路径

关键活动:不按期完成,则整个工程就不能按期完成的活动。

AOE网具有下列性质:

  • 只有在某个顶点代表的事件发生后,从该顶点出发的各条弧所代表的活动才能开始。
  • 只有在进入某一顶点的各条弧代表的活动结束后,该顶点所代表的时间才能发生。

小结:表示一个实际工程的AOE网应该是一个没有回路的带权有向图。由于整个工程只有一个开始点和结束点,因此AOE网中只有一个入度为0顶点(源点)和一个出度为0 的顶点(汇点)。


事件最早

事件最晚

活动最早

活动最晚

余量

求AOE网中关键路径和关键活动的算法步骤:

利用拓扑排序求出AOE网的一个拓扑序列

从拓扑序列的第一个顶点开始,按拓扑顺序依次计算出每个事件的最早发生事件ve[j]

从拓扑序列的最后一个顶点开始,假设不延误,按照逆拓扑顺序依次计算每个事件的最晚发生事件vl[j]

对每个活动<vi,vj>,若ve[i]+dur(i,j)=vl[j],则该活动为关键活动,并输出。

猜你喜欢

转载自blog.csdn.net/weixin_42734520/article/details/81568426