最小生成树
生成树
生成树:所有顶点均由边连接起来,但不存在回路的图
所有生成树具有以下共同特点:
- 生成树的顶点个数与图的顶点个数相同
- 生成树是图的极小连通子图,去掉一条边则非连通
- 一个有n个顶点的连通图的生成树有n-1条边
- 在生成树中再加一条边必然形成回路
- 生成树中任意两个顶点间的路径是唯一的
- 一个图可以有许多棵不同的生成树
含n个顶点n-1条边的图不一定是生成树
最小生成树
给定一个无向网,在该网的所有生成树中,各边权值之和最小的那棵生成树称为该网的最小生成树,也叫最小代价生成树
哈夫曼树是叶子带权值,最小生成树是边带权值
最小生成树的构造
MST性质: 设N(V,E)是一个连通网,U是顶点集V的一个非空子集。若边(u,v)是一条具有最小权值的边,其中uU,v
V-U,则一定存在在一棵包含边(u,v)的最小生成树 (贪心算法)
由MST性质得:v1到v3的边一定包含在最小生成树中
在生成树的构造过程中,图中n个顶点分属两个集合:已落在生成树上的顶点集U,尚未落在生成树上的顶点集V-U。接下来则应在所有连通U中顶点和V-U中顶点的边中选取权值最小的边
Prim(普里姆)算法
算法思想:
设N=(V,E)是连通网,TE是N上最小生成树中边的集合
初始令U={u0},{u0V},TE={}。
在所有uU,v
V-U的边(u,v)
E中,找一条代价最小的边{u0,v0}
将(u0,v0)并入集合TE,同时v0并入U
重复上述操作,直至U=V为止,则T={V,TE}是N的最小生成树
KrusKal(克鲁斯卡尔)算法
算法思想:
设连通网N=(V,E),令最小生成树初始状态为只有n个顶点而无边的非连通图T=(V,{}),每个顶点自成一个连通分量
在E中选取代价最小的边,若该边依附的顶点落在T中不同的连通分量上(即:不能成为环),则将此边加入到T中,否则舍去此边,取下一个代价最小的边
以此类推,直至T中所有顶点都在同一连通分量上为止
两种算法的比较
算法名 | 普里姆算法 | 克鲁斯卡尔算法 |
算法思想 | 选择点 | 选择边 |
时间复杂度 | O(n^2)(n为顶点数) | O(eloge)(e为边数) |
适应范围 | 稠密图 | 稀疏图 |
最短路径
在有向网中A点到达B点的多条路径中,寻找一条各边权值之和最小的路径,即最短路径
第一类问题:两点间最短路径,第二类问题:某起点到其他各点的最短路径
Dijkstra(迪杰斯特拉)算法
用来解决第一类问题
- 初始化:先找出从源点v0到各终点vk的直达路径(v0,vk),即通过一条弧到达的路径
- 选择:在这些路径中找出一条长度最短的路径(v0,u)
- 更新:然后对其余各条路径进行适当调整
若在图中存在弧(u,vk),且(v0,u)+(u,vk)<(v0,vk)
则以路径(v0,u+vk)代替(v0,vk)
在调整后的各条路径中,再找长度最短的路径,依此类推
Floyd(弗洛伊德)算法
算法思想:
逐个顶点试探,从vi到vj的所有可能存在的路径中寻找一个长度最短的路径
有向无环图及其应用
有向无环图:无环的有向图
AOV网:用一个有向图表示一个工程的各子工程及其相互制约的关系,其中顶点表示活动,弧表示活动之间的优先制约关系,称这种有向图为顶点表示活动的网,简称AOV网
AOE网:用一个有向图表示一个工程的各子工程及其相互制约的关系,其中弧表示活动,顶点表示活动的开始或结束事件,称这种有向图为边表示活动的网,简称AOE网
拓扑排序
AOV网的特点
- 若从i到j有一条有向路径,则i是j的前驱,j是i的后继
- 若<i,j>是网中有向边,则i是j的之间前驱;j是i的之间后继
- AOV网不允许有回路
拓扑排序:在AOV网中没有回路的前提下,我们将全部活动排列成一个线性序列,使得若AOV网中有弧<i,j>存在,则在这个序列中,i一定排在j的前面,具有这种性质的线性序列称为拓扑有序序列,相应的拓扑有序排序的算法称为拓扑排序
方法:
- 在有向图中选一个没有前驱的顶点且输出之
- 从图中删除该顶点和所有以它为尾的弧
- 重复上面两步,直至所有顶点均已输出,或者当图中不存在无前驱的顶点为止
一个AOV网的拓扑序列不唯一
检测AOV网中是否存在环:
对有向图构造的拓扑有序序列,若网中所有顶点都在它的拓扑有序序列中,则该AOV网比如不存在环
关键路径
用AOE网,顶点表示事件,弧表示活动,弧的权表示活动持续时间
源点:入度为0的顶点
汇点:出度为0的顶点
对于AOE网我们关心两个问题:
1、完成整项工程至少需要多少时间
2、哪些活动是影响工程进度的关键
关键路径——路径长度最长的路径
路径长度——路径上各活动持续时间之和(权值最大)
对于关键路径,需要定义四个描述量:
l(i)-e(i)——表示完成活动ai的时间余量
关键活动——关键路径上的活动,即I(i) == e(i)(即l(i)-e(i) ==0)的活动
最早发生时间:前面的活动都得进行完才能进行,所以是MAX{前面事件的最早发生时间+权值}
最晚发生时间:想要完成后面的事件,必须满足权值最大的活动也能完成,所以是MIN{后面事件的最完发生事件-权值}
e(i) = ve(j)
l(i) = vl(k) -
1、若网中有几条关键路径,则需加快同时在几条关键路径上的关键活动
2、如果一个活动处于所有的关键路径上,那么提高这个活动的速度能缩短整个工程的完成时间
3、处于所有的关键路径上的活动完成时间不能缩短太多,否则会使原本的关键路径变成不是关键路径,这时必须重新寻找关键路径