xjc123

 

实验报告

 

课程名称

  《算法分析与设计》                  

实验日期

  202138日至 2021 3 14 

学生姓名

        宣鉴超         

所在班级

 计算机194              

学号

  2019212212152          

实验名称

  举一个实例,画出采用Prim算法构造最小生成树的过程,并按实验报告编写算法                                                                       

实验地点

          寝室                    

同组人员

        宣鉴超                   

               

 

1.     问题

举一个实例,画出采用Prim算法构造最小生成树的过程。

转化为实际问题就是有n个村庄需要修通道路,已知每两个村庄之间的距离,问怎么修路,使得所有村庄都连通(但不一定有直接的公路相连,只要能间接通过公路到达即可),并且道路总长度最小?请计算最小的公路总长度。

2.     解析

以下为实例

令一张连通图的点集为V,未标记的点集合为V1V1 = V;

Prim算法的核心思想就是先在V中随意取一个点p并标记p,然后找出与p相连的最短边(是最小生成树的一部分),令这条边的另一个端点为q,我们标记q,然后同理找已经标记的点的未找到的最短边。最后得到的这些边构成了最小生成树。

 

3.     设计

void MiniSpanTree(MGraph *G) 

    int min, i, j, k; 

    int adjvex[MaxVex];       

    int lowcost[MaxVex];     

    lowcost[0] = 0;         

    adjvex[0] = 0;            

 

  //初始化操作

    for (i=1; i<G->numVertexes; ++i) 

    { 

        lowcost[i] = G->arc[0][i]; 

        adjvex[i] = 0;                

    }   

 

    for (i=1; i<G->numVertexes; ++i) 

    { 

        min = INFINITY; 

 

        j = 1; 

        k = 0;   

        while (j<G->numVertexes) 

        { 

            

            if (lowcost[j]!=0 && lowcost[j]<min) 

            { 

                min = lowcost[j]; 

                k = j; 

            } 

 

            ++j; 

        } 

        printf("(%d, %d)", adjvex[k], k);   

        lowcost[k] = 0;                      

        for (j=1; j<G->numVertexes; ++j) 

        { 

            if (lowcost[j]!=0 && G->arc[k][j]<lowcost[j]) 

            { 

                lowcost[j] = G->arc[k][j]; 

                adjvex[j] = k; 

            } 

        } 

    } 

4.     分析

 Prim算法遍历了每一个点,符合条件的点进行判断是否有符合条件的边,其中用优先队列优化了获取最短边的操作,时间复杂度为ELogV,空间复杂度为 n * n

5.     源码

prim算法:
https://github.com/dingwenjing520/-/blob/main/%E7%AE%97%E6%B3%95%E7%AC%AC%E4%B8%80%E6%AC%A1%E5%AE%9E%E9%AA%8C%EF%BC%88Prim%E7%AE%97%E6%B3%95%EF%BC%89.cpp

分类:

技术点:

相关文章: