• 数据结构 | 图


     最小生成树算法

    Prime算法

    算法思路:从已选顶点所关联的未选边中找出权重最小的边,并且生成树不存在环。

    其中,已选顶点是构成最小生成树的结点,未选边是不属于生成树中的边。

    例子:

    第一步: 

     假设我们从顶点v1开始,所以我们可以发现(v1,v3)边的权重最小,所以第一个输出的边就是:v1—v3=1: 

     第二步:

     在v1,v3相关联的边中选一个权值最小的边,首先了(v1,v3)已经访问过了,所以我们从其他边中寻找,发现(v3,v6)这条边最小,所以输出边就是:v3—-v6=4 

    然后,我们要从v1、v3、v6这三个点相关联的边中寻找一条权重最小的边,我们可以发现边(v6,v4)权重最小,所以输出边就是:v6—-v4=2. 


    然后,我们就从v1、v3、v6、v4这四个顶点相关联的边中寻找权重最小的边,发现边(v3,v2)的权重最小,所以输出边:v3—–v2=5 


    然后,我们就从v1、v3、v6、v4,v2这2五个顶点相关联的边中寻找权重最小的边,发现边(v2,v5)的权重最小,所以输出边:v2—–v5=3 


    最后,我们发现六个点都已经加入到集合U了,我们的最小生成树建立完成。

    Kruskal算法

    算法思路: 
    (1)将边按权值从小到大的顺序添加到新图中,保证添加的过程中不会形成环 

      (2)重复上一步直到连接所有顶点,此时就生成了最小生成树。这是一种贪心策略。

      (3)  n个顶点,n-1条边


    例子 :

    首先完整的图如下图: 

    è¿éåå¾çæè¿°
    然后,我们需要从这些边中找出权重最小的那条边,可以发现边(v1,v3)这条边的权重是最小的,所以我们输出边:v1—-v3=1 

    è¿éåå¾çæè¿°
    然后,我们需要在剩余的边中,再次寻找一条权重最小的边,可以发现边(v4,v6)这条边的权重最小,所以输出边:v4—v6=2 

    è¿éåå¾çæè¿°
    然后,我们再次从剩余边中寻找权重最小的边,发现边(v2,v5)的权重最小,所以可以输出边:v2—-v5=3, 

    è¿éåå¾çæè¿°
    然后,我们使用同样的方式找出了权重最小的边:(v3,v6),所以我们输出边:v3—-v6=4 

    è¿éåå¾çæè¿°
    好了,现在我们还需要找出最后一条边就可以构造出一颗最小生成树,但是这个时候我们有三个选择:(v1,V4),(v2,v3),(v3,v4),这三条边的权重都是5,首先我们如果选(v1,v4)的话,得到的图如下: 
     è¿éåå¾çæè¿°
    我们发现,这肯定是不符合我们算法要求的,因为它出现了一个环,所以我们再使用第二个(v2,v3)试试,得到图形如下: 

    è¿éåå¾çæè¿°
    我们发现,这个图中没有环出现,而且把所有的顶点都加入到了这颗树上了,所以(v2,v3)就是我们所需要的边,所以最后一个输出的边就是:v2—-v3=5


    拓扑排序

    首先建立(n个顶点的)AOV网

       (1) 在AOV网络中选一个没有直接前驱的顶点(入度为0的顶点),并输出之;

    (2)从途中删去该顶点,同时删去所有它发出的边;

        重复(1)和(2),直到全部顶点均已输出,拓扑有序序列形成,拓扑排序完成;

    若图中还有未输出的顶点,但已跳出处理循环,这说明图中存在环;

     

     AOV网络(Activity On VertexNetwork)

    不能出现有向回路,即有向环。在AOV网络中如果出现了有向环,则意味着某项活动应以自己作为先决条件。

     

     关键路径

     

    最早最晚时间:

    (1)事件vk的最早发生时间ve(k):决定了所有从vk开始的活动能够开工的最早时间;

    (2)活动ai的最早开始时间e(i):指该活动弧的起点所表示的事件的最早发生时间;

    (3)事件vk的最迟发生时间vl(k):指在不推迟整个工程完成的前提下,该事件最迟必须发生的时间;

      若一个活动的时间余量为0,则说明该活动必须要如期完成,d(i)=0即l(i)=e(i)的活动ai是关键活动,由关键活动组成的路径就是关键路径。


    步骤:
    (1)求所有事件的最早发生时间ve();

    (2)求所有事件的最迟发生时间vl();

    (3)求所有活动的最早发生事件e();

    (4)求所有活动的最迟发生时间l();

    (5)求所有活动的时间余量d();

    (6)d(i)=0的就是关键活动,所有关键活动组成的路径即为关键路径。


     

    ve(源点)等于0,vl(源点)需要自己算

    ve(汇点)=vl(汇点) 需要自己算

  • 相关阅读:
    40+的年龄50W+的年薪,2线城市入职名企,他曾想放弃测试?
    Redis从理论到实战:如何使用redis实现短信登录与注册?
    docker部署springboot程序时遇到的network问题
    【无标题】菜市场
    数据结构与算法(二):数组与链表
    LeetCode笔记:Weekly Contest 320
    TCP的三次握手和四次挥手
    Excel练习笔记(查漏补缺专用)
    基于web在线餐饮网站的设计与实现——蛋糕甜品店铺(HTML+CSS+JavaScript)
    [ansible]playbook结合项目解释执行步骤
  • 原文地址:https://blog.csdn.net/kazuma_hn/article/details/134273695