图论 —— 生成树 —— 最小生成树 —— Prim
【基本思想】
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相关推荐
- 图论 —— 生成树 —— 最小生成树 —— Kruskal
[基本思想] Kruskal 算法基本思想是并查集思想,将所有边升序排序,并认为每一个点都是孤立的,分属 n 个独立的集合. 按顺序枚举每一条边,如果这条边连接的两个点分属两个不同的集合,那么就将这条 ...
- [Java学习] 最小生成树——Prim算法
文章目录 最小生成树 Prim算法流程 应用实例 求最小生成树 最小生成树 百度百科上对于最小生成树的定义是这样的:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结 ...
- D-OJ刷题日记:使用邻接矩阵实现最小生成树Prim算法 题目编号:1135
理解: [理解prim算法本质--让一棵小树逐渐长大] Prim算法:又称为加边法,即每次选择最小权值的边加入到生成树中,然后再更新权值,如此反复,保证每次最优来达到最优解. Prim算法生成树用的是 ...
- 西南科技大学OJ题 求最小生成树(Prim算法)1075
求最小生成树(Prim算法) 1000(ms) 10000(kb) 2256 / 4495 Tags: 生成树 求出给定无向带权图的最小生成树.图的定点为字符型,权值为不超过100的整形.在提示中已经 ...
- 最小生成树-Prim算法详解(含全部代码)
目录 适用条件 测试所用图 算法详解 Prim算法代码 全部代码 实验结果 适用条件 加权连通图 测试所用图 所用原图及生成过程 其中,(a) 为原图,圆圈里面是节点的名称,边上的数字是边的权值.由实 ...
- 可视化最小生成树Prim、Kruskal
代码下载链接:(41条消息) 可视化最小生成树Kruskal,DEV配EGE-C文档类资源-CSDN文库 代码下载链接:(41条消息) 可视化最小生成树Prim,DEV配EGE-C文档类资源-CSDN ...
- poj1861 最小生成树 prim amp; kruskal
// poj1861 最小生成树 prim & kruskal // // 一个水题,为的仅仅是回味一下模板.日后好有个照顾不是#include <cstdio> #include ...
- 最小生成树prim、
过年那几天确实没好好学习.在老家闲着也是闲着.可是就是没看书. 回来这几天又一直在弄个人博客.买域名云服务器备案什么的- -. 麻烦死了呢. 在腾讯花1块钱备案了一个网站www.goodgoodstu ...
- 最小生成树Prim算法Java版
最小生成树Prim算法Java版 算法描述: 在一个加权连通图中,顶点集合V,边集合为E 任意选出一个点作为初始顶点,标记为visit,计算所有与之相连接的点的距离,选择距离最短的,标记visit. ...
最新文章
- 爬取网站图片并保存到本地
- php-fpm 参数及配置详解
- 关于MFC单选框的使用临时记录,稍后编辑
- 腾讯视频如何移出其他观看腾讯视频的设备
- java的 交换排序 快速排序算法_数据结构之排序算法Java实现(4)—— 交换类排序之快速排序算法...
- layui日期输入框
- Base64编码及应用
- 学习Python的pyecharts的过程中踩到的一些坑
- 2020年全球区块链专利排行榜TOP100,中国52家公司上榜
- 基于Unity3D的语音转文字功能的实现
- 2008服务器系统开机用户名和密码忘记了,服务器2008密码忘记了
- Frank-Wolfe和梯度投影方法MATLAB实现
- 马云:我是信念坚定的人
- Vue组件传值、Vue、组件
- java 重写equals的要点_重写equals 方法的注意事项
- statement的意思和用法
- 123456123456#5#----com.zzj.DinosourKnown235---前拼show后广--恐龙百科-333333
- ipvs命令~创建VS/NAT模式集群
- 转载 一个小时学会MySQL数据库(3)
- 什么是PATHINFO