最小生成树_AOV网(拓扑排序)_AOE网(关键路径)_最短路径

最小生成树

 

通俗的讲,最小生成树就是用一条路径将图中的所有顶点链接起来,并且保证该路径上的权值之和是最小的.以保证该路径的唯一.重点就在于权值的最小.

算法

普里姆算法: 该算法利用两个集合,一个是保存了,已经找到的符合条件(权值最小)的弧的顶点集合U,一个是保存了除U集合剩下的顶点的集合S. 若图G = {顶点V,  弧E}, 那么S = V – U

算法步骤:

1.初始化.选择图中的任意一个顶点u_0放到集合U中,表示选中一个顶点.U = {u_0}

2.计算S = V – U; 分别从U和S中选择一个顶点,保证u_0—-s_0在图中的弧是存在的并且所选取的s_0到U中选取的顶点u_0的权值是最小的. .然后将s_0放入U集合中.

3.重复步骤2.直至U == V.

 

克鲁斯卡尔算法: 初始时将图划分为顶点个数个集合. 每个顶点一个集合,在不同的集合中选取当前权值最小的顶点..

算法步骤:

1.初始化.将图按顶点划分集合.此时每个顶点(集合)是独立的.即不相等的..

2.在所有不相等的集合中选取两个顶点v_1, v_2.使得构成的弧v_1—>v_2的权值最小.然后将这两个顶点所处的集合 合并为一个集合.

3.重复步骤2.直至所有的顶点都在一个集合中…

————————————————————————————–

AOV网与拓扑排序

 

AOV网用顶点来表示活动,用弧来表示活动间的优先级 关系.的有向图.

拓扑排序

1,从一个没有入度为零的顶点开始,然后消去以该顶点为尾的弧,

2,重复步骤1.

若该图是有环路的,怎不能完成拓扑排序..

—————————————————————————————–

AOE网与关键路径

 

AOE网是带权的有向无环图,顶点表示事件,弧表示活动.权表示活动持续的时间.

基本概念:

源点,图中入度为零的顶点.

汇点,图中出度为零的顶点.

e(i)表示一个活动的最早开始时间, l(i)表示一个活动的最晚开始时间. 

Ve(i)表示一个事件的最早开始时间, Vl(i)表示一个事件的最晚发生时间.

源点事件的最早发生时间为0;

汇点事件的最早发生时间 == 最晚发生时间;

示例:

—> p–>q ;    (p—>q之间的活动为a1)

p事件的最早开始时间 == a1活动的开始时间 ;  e(p) == V(a1);

一个事件的最早发生时间取决于 以该事件为顶点的所有弧的权值最大的值..即若有两条弧分别是 

 i—>p, 权值是3;

 j—>p, 权值是5;

k—->p, 权值是6;

 那么可以看出此时p事件要发生必须要等待k—->p, 权值6的活动持续时间结束,才能开始事件p..(三条弧并发执行)..实际图中只有一个源点..

l(p)最晚发生时间是在不耽误全局进度的情况下,活动的最晚开始时间..l(p) – e(p) = t  表示活动的松弛度..

关键路径, 是图中从源点到达汇点的路径中..权值之和最大的那条路径.

关键路径的逻辑意义可以表示,该工程,要想在预计的时间内准确完成,必须 严格执行关键路径上的活动,并且保证其他非关键路径 不能 耽误全局的进度,也即某些事件的发生不能迟于该事件的最晚发生时间..若想加快工程的完成.必须加速关键路径上的活动速度才行..否则即使加快了非关键路径上的活动也不会使工程提前完成…

若某活动最早开始时间 == 最晚开始时间 则该活动的是 关键活动.. 相应的若某事件的最早发生时间 == 最晚发生时间,那该事件就是关键事件..

 

关键路径算法:

1.首先根据 —–源点事件的最早发生时间为0; 可以向后递推,所有事件的最早开始时间..直至汇点事件…

   Ve(j) = MAX(Ve(i) + <i, j>_活动的持续时间)———–取最大值..初始时i为源点..此过程是递推过程….

  因为源点的最早开始时间是0, 所以通过计算 所有以j为头的弧的权值,与该弧的尾的事件最早发生时间的 最大值来确定一个事件的最早开始时间..

2.再根据 ——–汇点事件的最早发生时间 == 最晚发生时间; 可以向前递推事件的最晚发生时间..因为此时汇点的最早发生时间 即使关键路径之和..也是工期的总时间.

   Vl(i) = Min(Vl(j) – <i, j>_活动持续时间);

   初始时j是汇点..然后通过计算汇点的前驱顶点的最晚发生时间i 而不断的向前递推所有时间的最晚发生时间..

3.知道了 所有事件的最早,最晚发生时间..相应的活动的最早,最晚开始时间也就确定了..只需找到最早和最晚相同的活动即使 关键活动. .链接在一起就构成了关键路径….

—————————————————————————————————

 

最短路径

从某源点出发到达其他各个顶点的最短路径

Dijkstra算法:

通过一个数组D[i]保存各个顶点到源点的路径权值,若v_i到源点v_0直接相连则D[i] 等于该弧的权值,否则D[i]的值为Max无限大..还需要一个集合S保存已经找到最短路径,所依附的顶点.若G = {V, E}; 那么还需要一个集合来表示除S外剩余的顶点W, W = V – S;

算法初始化D[i] 等于顶点i和源点直连的弧的权值,非直连的初始化为Max, 并将源点v_0放到S中,然后从集合W中开始查找到达源点v_0最短的弧的顶点v_i..我们看以看出,这个顶点要嘛是和 源点 v_0直连的,直接构成最短路径.要嘛是通过S集合中的某个顶点k(而S集合中的顶点k到源点的权值是已经求得的),然后由k连接v_i.构成源点到v_i的最短路径. 然后将v_i 放到S集合中.

关键在于 D[i] 数组中的权值..当我们在求得了,S中找到一个顶点使得该顶点v_i到源点v_0之间的权值最小,也即最短路径,该顶点到源点的最短路权值也就知道了..我们还可以知道在当前环境下,以该顶点为尾结点的弧  的头结点到源点的权值也可以计算出来(头结点可能不止一个). 假设该弧的尾结点为i, 头结点为j. 即<i, j>;  当知道i结点的最短路权值weight后, 相应的可以给j赋值一个此时的权值, 而j结点 的位置有两种情况:

1.顶点j与源点直接相连的,也就是说 j当前的最短路径权值是j_weight ,并不是Max,即D[j] = j_weight 此时假设 i_weight + <i, j>的权值 小于 D[j], 那么也就是说在当前以求得路径下,通过顶点i 到达 j顶点的路径是最短的..将该条路径记录. 当然仅仅是在当前的情况下,当求得了其他的顶点时也许会发现该顶点的最短路径权值不是最短的,那么只需要改变下路径, 和权值即可..若i_weight + <i, j>的权值 大于weight则无需修改j顶点的最短路权值..

2.顶点j 不与源点直接相连接..而是通过D[i] i = {S}中的顶点与源点 构成最短路径的.这时还是按照 1.中的比较规则..对D[j] 进行相应的操作…

 

每次都是从W中选取顶点,放到S中,直至S = V;

这样我们就发现算法其实就是在W集合中不断的选取顶点放到S中,使其到源点的路径最短,并更改与该顶点相链接的顶点的 权值. . D[]数组中保存顶点到源点 当前可能的最短路径.. 再没将顶点加入S集合中时.该顶点的最短路径是不确定锝..

算法步骤:

    D[]数组意义: D[i] 表示顶点i到源点的路径长度,初始时候,若非与源点直连则为Max.

1.将源点放入到S集合中.初始化D[]数组,

2.从W集合中根据D[]数组找一个距离源点最小的顶点,把该顶点放到S集合中,并计算与该顶点相邻接的其他顶点的当前最短路径权值..修改D[]数组中的权值.

3.重复步骤2.直至W = S;

 

 

 

 

 

 

 

 

 

 

 

    原文作者:拓扑排序
    原文地址: https://blog.csdn.net/xbaobei66/article/details/17189463
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞