• 【数据机构】最小生成树(prim算法)


    一.引例

    在n个城市之间建设通信网络,至少需要架设多少条通信线路?如果每两个城市之间架设通信线路的造价是不一样的,那么如何设计才能使得总造价最小?

    二.生成树与生成森林

    生成树:n个顶点的连通图G的生成树是包含G中全部顶点的一个极小连通子图。

    生成森林:在非连通图中,由每个连通分量都可以得到一颗生成树,这些连通分量的生成树就组成了一个非连通图的生成森林。

    三.最小生成树(Minimal Spanning Tree)

    MST性质:

    假设G=(V,E)是一个无向连通网,U是顶点集V的一个非空子集。若(u,v)是一条具有最小权值的边,其中u属于U,v属于V-U,则必存在一棵包含边(u,v)的最小生成树。 

    如何利用MST性质寻找最小生成树?

    找到两个点集之间最小权值的边

    如何处理点集,使得最小权值的边构成生成树? 

    1)从一个点出发,依次加入点形成点集(Prim)

    2)从边出发,将点集合并,避免形成环(Kruskal)

    四.Prim算法 

    1.基本思想:

    设G=(V,E)是具有n个顶点的连通网,T=(U,TE)是G的最小生成树,T的初始状态为U={u0},TE={},重复执行下述操作:找一条代价最小的边(u,v)并入合集TE,同时v并入U,直至U=V。

    2.代码实现:

    1. template<class T>
    2. void Prim(MGraph G,int start){
    3. int i,j,n=G.getVertexNum(),k;
    4. struct node shortEdge[n];
    5. for(i=0;i
    6. shortEdge[i].lowcost=G.arc[start][i];
    7. shortEdge[i].adjvex=start;
    8. }
    9. shortEdge[start].lowcost=0;
    10. //起点放入集合U中
    11. for(i=0;i-1;i++){
    12. k=minEdge(shortEdge, n);//寻找最短边的邻接点k
    13. outputSMT(k, shortEdge[k]);//输出最小生成树路径
    14. shortEdge[k].lowcost=0;//将顶点k加入到集合U中
    15. for(j=0;j//调整数组shortEdge
    16. if(G.arc[k][j]
    17. shortEdge[j].lowcost=G.arc[k][j];
    18. shortEdge[j].adjvex=k;
    19. }
    20. }
    21. }
    22. }
    23. int minEdge(struct node shortEdge[],int n){
    24. int i,min=0,flag=1;
    25. for(i=0;i
    26. if(shortEdge[i].adjvex!=0&&flag){
    27. min=i;
    28. flag=0;
    29. }
    30. else if(shortEdge[i].adjvex!=0){
    31. if(shortEdge[i].lowcost
    32. min=i;
    33. }
    34. }
    35. }
    36. return min;
    37. }
    38. void outputSMT(int k,struct node shortEdge){
    39. cout<<"("<","<")"<
    40. }

    3.时间复杂度

    Prim算法的时间复杂度为O(n^2)与 顶点数有关

  • 相关阅读:
    C++ Reference: Standard C++ Library reference: C Library: cstring: strncmp
    Spearman、Pearson相关系数
    React Native填坑之旅--Flow篇
    笔记(一)斯坦福CS224W图机器学习、图神经网络、知识图谱
    MT4 PC端历史版本更新(老版本MT4下载)
    如何帮助 3D CAD 设计师实现远程办公
    阶段总结(技术向)
    项目资源管理的流程、技术和工具
    电脑系统安装后桌面图标隔开很宽怎么调?
    常用数学点回顾
  • 原文地址:https://blog.csdn.net/Hsianus/article/details/134511110