算法-作业1-prim算法和kruskal算法

1.问题

在这里插入图片描述在这里插入图片描述

2.解析

1)Prim算法
初始状态:V是所有顶点的集合,即V={A,B,C,D,E,F,G};U和T都是空!
第1步:将顶点A加入到U中。 此时,U={A}。
第2步:将顶点B加入到U中。上一步操作之后,U={A}, V-U={B,C,D,E,F,G};因此,边(A,B)的权值W最小。将顶点B添加到U中;此时,U={A,B}。
第3步:将顶点F加入到U中。上一步操作之后,U={A,B}, V-U={C,D,E,F,G};因此,边(B,F)的权值W最小。将顶点F添加到U中;此时,U={A,B,F}。
第4步:将顶点E加入到U中。 上一步操作之后,U={A,B,F}, V-U={C,D,E,G};因此,边(F,E)的权值W最小。将顶点E添加到U中;此时,U={A,B,F,E}。
第5步:将顶点D加入到U中。 上一步操作之后,U={A,B,F,E}, V-U={C,D,G};因此,边(E,D)的权值W最小。将顶点D添加到U中;此时,U={A,B,F,E,D}。
第6步:将顶点C加入到U中。 上一步操作之后,U={A,B,F,E,D}, V-U={C,G};因此,边(D,C)的权值W最小。将顶点C添加到U中;此时,U={A,B,F,E,D,C}。
第7步:将顶点G加入到U中。 上一步操作之后,U={A,B,F,E,D,C}, V-U={G};因此,边(F,G)的权值W最小。将顶点G添加到U中;此时,U=V。
此时,最小生成树构造完成!它包括的顶点依次是:A B F E D C G。
在这里插入图片描述

2)kruskal算法
第1步:将边<E,F>加入R中。 边<E,F>的权值最小,因此将它加入到最小生成树结果R中。
第2步:将边<C,D>加入R中。 上一步操作之后,边<C,D>的权值最小,因此将它加入到最小生成树结果R中。
第3步:将边<D,E>加入R中。 上一步操作之后,边<D,E>的权值最小,因此将它加入到最小生成树结果R中。
第4步:将边<B,F>加入R中。 上一步操作之后,边<C,E>的权值最小,但<C,E>会和已有的边构成回路;因此,跳过边<C,E>。同理,跳过边<C,F>。将边<B,F>加入到最小生成树结果R中。
第5步:将边<E,G>加入R中。上一步操作之后,边<E,G>的权值最小,因此将它加入到最小生成树结果R中。
第6步:将边<A,B>加入R中。 上一步操作之后,边<F,G>的权值最小,但<F,G>会和已有的边构成回路;因此,跳过边<F,G>。同理,跳过边<B,C>。将边<A,B>加入到最小生成树结果R中。
此时,最小生成树构造完成!它包括的边依次是:<E,F> <C,D> <D,E> <B,F> <E,G> <A,B>。
在这里插入图片描述

3.设计

1)Prim算法

void Prim()
{ 
   U = {A};
   while (1) {
     v= 未收录顶点中W最小者;
     if ( 这样的v不存在 ){
         break;
         }
     将v收录进U: visit[v] = 0;dist[v]=0;
     for ( v的每个邻接点u ){
        if ( visit[u]!=0未被收录  ){
          if ( E (v,u)<dist[u]){
            dist[u] = E (v,u) ;
            parent[u] = v;
        }
      }
      if ( U中收的顶点不到|V|个 ){
         Error ( “生成树不存在” );
   }
}

2)Kruscal算法

 void Kruskal ( Graph G ){
   T= { } ;
   while ( T中不到 |V| 1 条边 && E 中还有边 ) {
     从 E 中取一条权重最小的边 E (v,w) ; /* 最小堆 */
     将 E (v,w) 从 E 中删除;
     if ( E (v,w) 不在 最小生成树 中构成回路) /* 并查集 */
        将 E (v,w) 加入 T,  w加入U;
     else
        无视 E (v,w) ;
    }
    if ( 最小生成树 中不到 |V| 1 条边 )
        Error ( “生成树不存在” );
}

4.分析
1)Prim算法
① (朴素版)每个顶点被选择一次,每次都遍历其他各个顶点,时间复杂度为O(n^2),空间复杂度为O(n)
② (堆优化)时间复杂度为O(mlogn)
2) Kruscal算法
① 初始化生成树的边集A为空集:O(1)
② 对集合中的每一个顶点,都将它的集合初始化为自身:O(V)
③ 将边按权值进行排序:O(ElogE)
④ 对排序好后的边从小到大进行判断,如果这条边所连的2个顶点不在同一个集合中,则将这条边加入到生成树的边集A中,并将此边所连的两个顶点u和v的集合做一个合并操作,如此循环加到生成树中的边集数量为n-1时停止:O(V+E)
⑤ 综上所述,kruscal的时间复杂度应为O(ElogE),即nlogn,空间复杂度为O(E)
5.源码
[github源码地址]

https://github.com/yuding-x/Algorithm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值