当前位置: 首页 > article >正文

【数据机构】最小生成树(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.代码实现:

template<class T>
void Prim(MGraph <T>G,int start){
    int i,j,n=G.getVertexNum(),k;
    struct node shortEdge[n];
    
    
    for(i=0;i<n;i++){
        shortEdge[i].lowcost=G.arc[start][i];
        shortEdge[i].adjvex=start;
    }
    shortEdge[start].lowcost=0;
    //起点放入集合U中
    
    for(i=0;i<n-1;i++){
        k=minEdge(shortEdge, n);//寻找最短边的邻接点k
        outputSMT(k, shortEdge[k]);//输出最小生成树路径
        shortEdge[k].lowcost=0;//将顶点k加入到集合U中
        for(j=0;j<n;j++){//调整数组shortEdge
            if(G.arc[k][j]<shortEdge[j].lowcost){
                shortEdge[j].lowcost=G.arc[k][j];
                shortEdge[j].adjvex=k;
            }
        }
    }
}

int minEdge(struct node shortEdge[],int n){
    int i,min=0,flag=1;
    for(i=0;i<n;i++){
        if(shortEdge[i].adjvex!=0&&flag){
            min=i;
            flag=0;
        }
        else if(shortEdge[i].adjvex!=0){
            if(shortEdge[i].lowcost<shortEdge[min].lowcost){
                min=i;
            }
        }
    }
    return min;
}

void outputSMT(int k,struct node shortEdge){
    cout<<"("<<shortEdge.adjvex<<","<<k<<")"<<shortEdge.lowcost;
}

3.时间复杂度

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


http://www.kler.cn/news/135692.html

相关文章:

  • Harmony Ble 蓝牙App (一)扫描
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • SpringCloud相关
  • Mac安装win程序另一个方案
  • TCP传输的三次握手、四次挥手策略是什么
  • 【苏州元德维康生物医药-注册】
  • 2.3IP详解及配置
  • 给大伙讲个笑话:阿里云服务器开了安全组防火墙还是无法访问到服务
  • java 位运算 表示状态小记
  • HDD与QLC SSD深度对比:功耗与存储密度的终极较量
  • C#中ManualResetEvent的Reset,Set,WaitOne
  • 手把手从零开始训练YOLOv8改进项目(官方ultralytics版本)教程
  • uniapp如何使用api相关提示框
  • Springboot框架中使用 Redis + Lua 脚本进行限流功能
  • Flutter最新稳定版3.16 新特性介绍
  • 达尔优EK87键盘说明书
  • sapjco3.dll has version “721.619“, but required is at least version “721.913“
  • 【Spring boot】RedisTemplate中String、Hash、List设置过期时间
  • 【Java并发编程九】同步控制
  • Redis-核心数据结构
  • 【C/PTA】数组进阶练习(一)
  • 4.Spring IoC 的实现机制是什么?
  • Bean实例化的基本流程
  • 色彩的基础知识——适用于camera tuning
  • Failed to execute org.scala-tools:maven-scala-plugin:2.15.2解决
  • 携带二进制文件的软件恢复方法
  • ZC序列理论学习及仿真
  • 【人工智能时代的刑法体系与责任主体概述】
  • 数据结构:枚举
  • 图片降噪软件 Topaz DeNoise AI mac中文版功能