【基本思想】

Prim 算法基本思想是蓝白点思想,用白点代表已进入最小生成树的点,蓝点代表未进入最小生成树的点。

每次循环都将一个蓝点 u 变为白点,并且此蓝点 u 与白点相连的最小边权 min[u] 还是当前所有蓝点中最小的。这相当于每次循环让一个新的点加入生成树,让一条最小边加入生成树,n-1 次循环就能生成一棵含有 n 个点的树,最后得到的一定是最小生成树。

其时间复杂度为:O(N*N),N 代表点数。

【算法分析】

以下图为例,蓝点和虚线代表未进入最小生成树的点、边,白点和实现代表已进入最小生成树是点、边。

初始时,所有点都是蓝点,min[1]=0,min[2、3、4、5]=INF,权值和 MST=0。

第一次循环找到 min[1]=0 最小的蓝点 1。将 1 变为白点,接着枚举与 1 相连的所有蓝点 2、3、4,修改它们与白点相连的最小边权。故有:min[2]=w[1][2]=2,min[3]=w[1][3]=4,min[4]=w[1][4]=7,MST=0。

第二次循环是找到 min[2] 最小的蓝点 2。将 2 变为白点,接着枚举与 2 相连的所有蓝点 3、5,修改它们与白点相连的最小边权。故有:min[3]=w[2][3]=1,min[5]=w[2][5]=2,MST=2。

第三次循环是找到 min[3] 最小的蓝点 3。将 3 变为蓝点,接着枚举与 3 相邻的所有蓝点 4、5,修改它们与白点相连的最小边权。故有:min[4]=w[3][4]=1,由于 min[5]=2<w[3][5]=6,所以不修改 min[5] 的值,MST=3。

最后两轮循环将点 4、5 以及边 w[2][5]、w[3][4] 添加进最小生成树。

最后权值之和 MST=6。

【算法描述】

以 1 为起点生成最小生成树,vis[v] 代表 v 点是否加入最小生成树中,min[v] 代表蓝点 v 与白点相连的最小边权,MST 代表最小生成树边权之和。

初始化:

vis[1...n]=false,MST=0

min[v]=INF(v≠1),min[1]=0

主体

void Prim()
{for(int i=1;i<=n;i++){int u=0;for(int j=1;j<=n;j++)//枚举所有点if( vis[j]==false && min[j]<min[u])//寻找与白点相连的权值最小的蓝点uu=j;vis[u]=true;//蓝点u加入生成树,标记为白点for(int j=1;j<=n;j++)//修改所有与u相连的蓝点if( vis[j]==false && g[u][j]<min[j] )min[j]=g[u][j];}//权值和的计算int MST=0;for(int i=1;i<=n;i++)MST+=min[i];
}

【模版】

int n,m;//n个点m条边
int G[N][N];
int dis[N];
bool vis[N];
int MST;
void Prim(){for(int i=1;i<=n;i++){int k;int minn=INF;for(int j=1;j<=n;j++){//枚举所有点if(!vis[j]&&dis[j]<minn){//寻找与白点相连的权值最小的蓝点uminn=dis[j];k=j;}}vis[k]=true;//蓝点u加入生成树,标记为白点for(int j=1;j<=n;j++)//修改所有与u相连的蓝点if(!vis[j]&&dis[j]>G[k][j])dis[j]=G[k][j];}MST=0;for(int i=1;i<=n;i++)//权值和的计算MST+=dis[i];
}int main(){cin>>n>>m;memset(vis,false,sizeof(vis));for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)cin>>G[i][j];for(int i=1;i<=n;i++)dis[i]=G[1][i];Prim();cout<<MST<<endl;return 0;
}

图论 —— 生成树 —— 最小生成树 —— Prim相关推荐

  1. 图论 —— 生成树 —— 最小生成树 —— Kruskal

    [基本思想] Kruskal 算法基本思想是并查集思想,将所有边升序排序,并认为每一个点都是孤立的,分属 n 个独立的集合. 按顺序枚举每一条边,如果这条边连接的两个点分属两个不同的集合,那么就将这条 ...

  2. [Java学习] 最小生成树——Prim算法

    文章目录 最小生成树 Prim算法流程 应用实例 求最小生成树 最小生成树 百度百科上对于最小生成树的定义是这样的:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结 ...

  3. D-OJ刷题日记:使用邻接矩阵实现最小生成树Prim算法 题目编号:1135

    理解: [理解prim算法本质--让一棵小树逐渐长大] Prim算法:又称为加边法,即每次选择最小权值的边加入到生成树中,然后再更新权值,如此反复,保证每次最优来达到最优解. Prim算法生成树用的是 ...

  4. 西南科技大学OJ题 求最小生成树(Prim算法)1075

    求最小生成树(Prim算法) 1000(ms) 10000(kb) 2256 / 4495 Tags: 生成树 求出给定无向带权图的最小生成树.图的定点为字符型,权值为不超过100的整形.在提示中已经 ...

  5. 最小生成树-Prim算法详解(含全部代码)

    目录 适用条件 测试所用图 算法详解 Prim算法代码 全部代码 实验结果 适用条件 加权连通图 测试所用图 所用原图及生成过程 其中,(a) 为原图,圆圈里面是节点的名称,边上的数字是边的权值.由实 ...

  6. 可视化最小生成树Prim、Kruskal

    代码下载链接:(41条消息) 可视化最小生成树Kruskal,DEV配EGE-C文档类资源-CSDN文库 代码下载链接:(41条消息) 可视化最小生成树Prim,DEV配EGE-C文档类资源-CSDN ...

  7. poj1861 最小生成树 prim amp; kruskal

    // poj1861 最小生成树 prim & kruskal // // 一个水题,为的仅仅是回味一下模板.日后好有个照顾不是#include <cstdio> #include ...

  8. 最小生成树prim、

    过年那几天确实没好好学习.在老家闲着也是闲着.可是就是没看书. 回来这几天又一直在弄个人博客.买域名云服务器备案什么的- -. 麻烦死了呢. 在腾讯花1块钱备案了一个网站www.goodgoodstu ...

  9. 最小生成树Prim算法Java版

    最小生成树Prim算法Java版 算法描述: 在一个加权连通图中,顶点集合V,边集合为E 任意选出一个点作为初始顶点,标记为visit,计算所有与之相连接的点的距离,选择距离最短的,标记visit. ...

最新文章

  1. 爬取网站图片并保存到本地
  2. php-fpm 参数及配置详解
  3. 关于MFC单选框的使用临时记录,稍后编辑
  4. 腾讯视频如何移出其他观看腾讯视频的设备
  5. java的 交换排序 快速排序算法_数据结构之排序算法Java实现(4)—— 交换类排序之快速排序算法...
  6. layui日期输入框
  7. Base64编码及应用
  8. 学习Python的pyecharts的过程中踩到的一些坑
  9. 2020年全球区块链专利排行榜TOP100,中国52家公司上榜
  10. 基于Unity3D的语音转文字功能的实现
  11. 2008服务器系统开机用户名和密码忘记了,服务器2008密码忘记了
  12. Frank-Wolfe和梯度投影方法MATLAB实现
  13. 马云:我是信念坚定的人
  14. Vue组件传值、Vue、组件
  15. java 重写equals的要点_重写equals 方法的注意事项
  16. statement的意思和用法
  17. 123456123456#5#----com.zzj.DinosourKnown235---前拼show后广--恐龙百科-333333
  18. ipvs命令~创建VS/NAT模式集群
  19. 转载 一个小时学会MySQL数据库(3)
  20. 什么是PATHINFO

热门文章

  1. 一个案例、6个步骤全程详解A/B测试,看这篇就够了!
  2. 这个开源组织里的项目都是精品
  3. GitHub被“中介”攻击了?中间人攻击?
  4. 一文了解Redis持久化
  5. 漫话:如何给女朋友解释什么是适配器模式?
  6. SAP 采购流程和销售流程
  7. 实践中整理出tomcat集群和负载均衡
  8. SpringBoot2 整合Kafka组件,应用案例和流程详解
  9. SpringBoot2.0 基础案例(07):集成Druid连接池,配置监控界面
  10. GitHub建立个人网站(三)