什么是最小生成树??当在一个图中,这个图描绘了节点与节点的关系,表现为这个节点到下一个节点的 “代价” 那么我们想把这个图中的各个节点用最小的代价连接起来该怎么办呢??这里就要知道一个关键词,最小生成树。  那么是否有实际应用呢??例如:要在n个城市之间铺设光缆,主要目标是要使这 n 个城市的任意两个之间都可以通信,但铺设光缆的费用很高,且各个城市之间铺设光缆的费用不同,因此另一个目标是要使铺设光缆的总费用最低。这就需要找到带权的最小生成树。好下面我们就直接贴代码:在代码中有注释能直接更快的明白最小生成树该怎么写!

代码一:prim(普里姆)算法
/*
prim算法是一个不高效,并且占用内存较为高的一种最小生成树算法。但是好理解。这样呢也确实一种方法。
毕竟学习算法就是学习思想嘛!
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,mann[100][100],vis[100],dis[100];
//mann中存储节点之间的距离,默认是最大值mx
//vis数组是标记节点是否已经被加入的了最小生成树里边
//dis是记录最小生成树到各个未加入最小生成树节点的距离
const int mx=1<<29;//上限,这个程序的最大值int pri(){for(int j=1;j<=n;j++){dis[j]=mann[1][j];//初始化dis,以后会更新}memset(vis,0,sizeof(vis));//初始化vis,表示都未加入最小生成树vis[1]=1;//表示节点1加入最小生成树。int minn,to,sum=0;for(int i=1;i<n;i++){minn=mx;for(int j=1;j<=n;j++){if(!vis[j]&&dis[j]<minn){//是否加入最小生成树,并且是最小值minn=dis[j];to=j;//记录最小生成树到其他节点的代价最小的下标}}sum+=minn;//总代价+当前算出的小代价vis[to]=1;//表示当前找到最小节点加入最小生成树for(0int j=1;j<=n;j++){if(!vis[j]){//判断是否加入最小生成树dis[j]=min(dis[j],mann[j][to]);//更新各个单独节点到最小生成树的最小距离}}}return sum;
}int main(){while(~scanf("%d%d",&n,&m)){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){//初始化某节点到某节点为当前程序的极大值mann[i][j]=mx;}}int f,t,v;//表示f节点到t节点的代价为vfor(int i=1;i<=m;i++){scanf("%d%d%d",&f,&t,&v);mann[f][t]=v;mann[t][f]=v;}printf("%d\n",pri());}return 0;
}

介绍完prim(普里姆)算法就该介绍 kruskal(克鲁斯卡尔)算法了 ,kruskal算法涉及到了并查集的知识但是 如果并查集学得好 看一眼就会知道原理了。
代码二:kruskal(克鲁斯卡尔)算法

/*这个算法比起prim算法是比较节省空间的。并且感觉时间上也是很节省的。因为是先排序再查找。
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,record[100];
//n,m   n代表节点的总数,m代表在节点间共有多少种代价。
//record代表各个节点到 “祖” 的距离,学过并查集都知道这个东西
struct node{int f,t,v;//f到t节点的代价为v
}Array[100];
int cmp(node a,node b){return a.v<b.v;
}
int _find(int x){if(x!=record[x]){record[x]=_find(record[x]);//查找到 祖 值后进行路径压缩}return record[x];
}
int solve(){int sum=0,cnt=0;for(int i=1;i<=m;i++){int f=_find(Array[i].f);int t=_find(Array[i].t);if(f!=t){//在最小生成树里边,都有着共同的 “祖” 值。没有共同的祖值表示 未加入到最小生成树里边record[f]=t;sum+=Array[i].v;//总代价增加cnt++;}if(cnt==n-1){//因为如果把所有节点连上了后肯定需要n-1个边return sum;}}return -1;
}
int main(){while(~scanf("%d%d",&n,&m)){for(int i=1;i<=n;i++){record[i]=i;//初始化各个节点的  "祖"  值}for(int i=1;i<=m;i++){scanf("%d%d%d",&Array[i].f,&Array[i].t,&Array[i].v);}sort(Array+1,Array+m+1,cmp);//对各个节点 代价 进行排序。按照从小到大printf("\n%d\n",solve());}return 0;
}

最后: Prim算法和Kruskal算法都能从连通图找出最小生成树。区别在于Prim算法是挨个找,而Kruskal是先排序再找。是不是感觉最小生成树很简单呢???当然如果你想要把 Prim算法和Kruskal算法合并的话可以尝试用链表这个数据结构存储节点–>排序–>像Kruskal算法那样生成最小生成树!!

心灵鸡汤:
    既然选择程序,就要匠心所致;
    既然选择远方,就要风雨兼程

最小生成树的两个模板相关推荐

  1. 免费分享狂雨小说cms完整源码和两套模板带完善采集规则

    狂雨小说cms是非常好用的一个系统,搭建起来一键安装,就算是小白也能几分钟就搭建出来,奈何很多人不对写采集规则,一个小说站没有采集手动发布是不太现实的事情,但很多人一看到采集规则却不知道怎么下手,或者 ...

  2. 最新ThinkPHP开发淘宝客内部优惠券免授权开元版源码_后台多种采集优惠券方式+WAP手机版+两套模板

    源码介绍 又是一款基于ThinkPHP内核开发的淘宝客内部优惠券分享系统源码,之前已经分享过很多淘宝客的源码了,今天这款源码不仅界面更加优美整洁,整体仿照券皮网的模板来做的,后台更多两种模板可供选择! ...

  3. 百万千万爆款视频的脚本是怎么写出来的?两套模板教你做同款

    那些百万千万爆款视频的脚本是怎么写出来的?两套模板教你做同款. 每天都能刷到百万赞的短视频,看看自己的视频点赞量,失落是一种感觉,其实你也可以做出优秀的爆款文案. 今天给大家介绍两种短视频脚本模板,大 ...

  4. Kruskal(克鲁斯卡尔) 最小生成树 算法详解+模板

    最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树. 例如,对于如上图G4所示的连通网可以有多棵权值总和 ...

  5. SDUT ACM 2144 最小生成树,克鲁斯卡尔模板

    图结构练习--最小生成树 Time Limit: 1000MS    Memory limit: 65536K 题目描述 有n个城市,其中有些城市之间可以修建公路,修建不同的公路费用是不同的.现在我们 ...

  6. prim算法求最小生成树_最小生成树的两种方法(Kruskal算法和Prim算法)

    关于图的几个概念定义: 连通图:在无向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该无向图为连通图. 强连通图:在有向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该有向图为强连 ...

  7. 最小生成树 算法思想及模板代码

    问题描述及解法分类 一般不用堆优化版的Prim算法,直接用朴素版的Prim算法. 对于稀疏图而言,点多,边少,适合用克鲁斯卡尔算法 对于稠密图而言,点少,边多,适合用普利姆算法 Prim算法 算法思想 ...

  8. #176 – Two Kinds of Templates(两种模板)

    原文地址:  https://wpf.2000things.com/2011/01/04/176-two-kinds-of-template/ 在WPF中,有两种类型的模板--控件模板(Contr ...

  9. 通过思维导图学习知识的两种模板鉴赏

    在学习中,我们可以制作思维导图来帮助记忆.理解.正所谓千言万语不如图,一张简单的思维导图就能涵盖整篇文章的中心思想.分析出事物之间的关系.而在制作思维导图的时候,人脑也跟着进行分析,这才是思维导图最大 ...

最新文章

  1. 中国电子学会青少年编程能力等级测试图形化四级编程题:抽奖
  2. App项目实战之路(二):API篇
  3. numpy 100题
  4. 安装Realtek HD Audio Driver 失败 就是安装不上怎么办
  5. React Bind Handle的思考
  6. Windows 技术篇 - 电脑秒速关机设置方法,注册表修改3个缓冲等待时间
  7. 关于业务系统的架构思考
  8. PHP前端和数据库的连接
  9. [云炬创业基础笔记]第七章创业资源测试6
  10. linux中gradle编译慢,【Linux】解决linux下android studio用gradle构建从jcenter或maven下载依赖太慢...
  11. Future机制原理
  12. 数据库开发综合案例——仓库管理系统设计
  13. Unix编程艺术之第一部分
  14. 永洪BI到底有多好用?知乎大V用3000字力荐
  15. 一次监视雷达行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  16. 环境样品中病毒的富集与检测方法
  17. FDMA和TDMA简介
  18. 怎么看电脑网卡是否支持5g频段
  19. 阿里云云边一体容器架构创新论文被云计算顶会 ACM SoCC 录用
  20. 如何开发一个动物识别系统毕业设计毕设作品

热门文章

  1. 普洱熟茶发霉怎么办?
  2. IT6722A 宽范围高精度稳压电源技术参数
  3. 继电器的吸和与释放电压
  4. 主流浏览器的调试工具
  5. 【OpenGL】绘制球体
  6. 深入探索微信公众号开发:Java代码实现与最佳实践
  7. 单变量线性回归的最小二乘法公式
  8. SaaS平台为中小企业信息化服务的优势
  9. 恭喜您成为 2017 年度 Microsoft MVP
  10. 年销400万辆、营收6000亿元,长城汽车是否过于激进?