图
定义:图是由顶点集V和顶点间的关系集合E(边的集合)组成的一种数据结构,可以用二元组定义为:G=(V,E)
术语:
有向图和无向图:在图中,若用箭头标明了边是由方向性的,则为有向图,否则称为无向图。
完全图:具有n个顶点,n(n-1)/2条边的图,称为完全无向图。具有n个顶点,n(n-1)条弧的有向图,称为完全有向图,两者都称为完全图。
稠密图:边数多于完全图的一半
稀疏图:边数少于完全图的一半
度:一个顶点依附的边或弧的数目,称为该顶点的度。等于该顶点的入度和出度之和。
入度:一个顶点依附的弧头数目,称为该顶点的入度
出度:一个顶点依附的弧尾数目,称为该顶点的出度
图的存储结构
图的邻接矩阵表示:
从无向图的邻接矩阵中可以得出如下结论:
- 邻接矩阵是对称的
- 第i行或第i列1的个数为顶点i的度
- 矩阵中1的个数的一半为图中边的数目
- 顶点i和j相连看i行j列值是否为1
从有向图的邻接矩阵可以得出如下结论:
- 矩阵不一定是对称的
- 第i行中1的个数为顶点i的出度
- 第i列中1的个数为顶点i的入度
- 矩阵中1的个数为图中弧的数目
- 很容易判断顶点i和顶点j是否有弧相连
网的邻接矩阵表示:
邻接表:
从无向图的邻接表可以得到如下结论:
- 第i个链表中结点数目为顶点i的度
- 所有链表中结点数目的一半为图中边数
- 占用的存储单元数目为n+2e
从有向图的邻接表可以得到如下结论:
第i个链表中结点数目为顶点i的出度
所有链表中结点数目为图中弧数
占用的存储单元数目为n+e
图的遍历
定义:从图中某一顶点出发访遍图中其余顶点,且使每个顶点仅被访问一次
两条遍历图的路径:深度优先搜索(栈)、广度优先搜索(队列)
深度优先搜索遍历:
- 首先访问顶点i,并将其访问标记置为访问过,即Visited[i]=1;
- 然后搜索与顶点i有边相连的下一个顶点j,若j未被访问过,则访问它,并将j的访问标记置为访问过,即Visited[j]=1,然后从j开始重复此过程,若j已访问,再看与i有边相邻的其他顶点
- 若与i有边相连的顶点都被访问过,则退回到前一个访问顶点重复刚才过程,直到图中所有顶点都被访问完为止。
广度优先搜索遍历:
- 开始时要将其置空
- 在每访问一个顶点时,要将其入队
- 在访问一个顶点的所有后继时,要将其出队
- 若队列为空时,说明每一个访问过的所有后继均已访问过。因而本次遍历结束。若此时还有未访问的顶点,需要另选起点进行遍历。
生成树和最小生成树
生成树:
在图论中,常常将树定义为一个无回路连通图。
最小生成树:
若生成树中每条边上权值之和达到最小,称为最小生成树。
普利姆(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()
弗洛伊德算法:
拓扑排序
实现步骤:
- 在AOV网中选一个入度为0的顶点且输出之
- 从AOV网中删除此顶点及该顶点发出来的所有有向边
- 重复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],则该活动为关键活动,并输出。