图是一种基础又重要的数据结构,图的生成树是图的一个极小连通子图。最小生成树是无向连通网的所有生成树中边的权值之和最小的一棵生成树。求图的最小生成树可以牵引出很多经典的题目,例如在N个城市之间建立通讯网络,问怎样最省经费(不同城市之间的联系网的费用不同,也即是边上的权值不同)。

求图的最小生成树有两种算法,普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法。下面是我对他们的简化理解。(只对Kruskal进行了简单的实现)
    ① Prim算法的主要思想就是:假设N=(V, {E})是连通网,TE是N上最小生成树边集合。
(1) U={u0}(u0属于V),   TE={ }
(2) 在所有uU,vV-U的边(u,v)E 中找一条代价最小的边(u0,v0)并入集合TE, 同时v0并入U,
(3) 如果U≠V,转(2) (直到U=V为止)
     最后:TE中必有n-1条边,则T=(V,{TE})为N的最    小生成树。
粗略的看起来似乎干涩难懂,其实方法不难,就是把顶点分成两个集合,一个是生成树顶点集合,一个是其它顶点集合,且求最小生成树的过程就是从其它顶点集合选取点加入到生成树顶点的过程。怎么选取呢,其实方法很简单,就是从其它顶点集合中选一个可以连接到生成树顶点且权最小的点,加入到生成树顶点。下面用图来说明下:
这就是Prim建立最小生成树的过程。
为实现此算法需设置辅助数组closedge ,对当前V-U中每个顶点,记录从U到V-U的代价最小的边:
struct{VerTexType adjvex; //最小边在U中的那个顶点ArcType lowcost;     //最小边上的权值
}closedge[MVNum];
    ②Kruskal算法,我认为这个可能更简单,具体的方法也实现起来也容易,先构造一个只含 n 个顶点的子图 SG,然后从权值最小的边开始,若它的添加不使SG 中产生回路,则在 SG 上加上这条边,如此重复,直至加上 n-1 条边为止。还是用图来说明比较好理解:
下面就来Kruskal来简单实现以下:
#include<iostream>
using namespace std;typedef struct
{int cost;char v1,v2;
}Edge;char temp[100];
int flag=0;
int check(char k,int m)
{int i;for(i=0;i<m;i++){if(temp[i]==k)return 1;}return 0;
}int main()
{int i,j,n,m;Edge edges[100],t;cout<<"输入顶点数和边数:";cin>>m>>n;cout<<"依次输入多组v1 v2 cost:"<<endl;for(i=0;i<n;i++){cin>>edges[i].v1>>edges[i].v2>>edges[i].cost;}for(i=0;i<n;i++)  {  for(j=i+1;j<n;j++)  {  if(edges[i].cost>edges[j].cost)  {  t=edges[i];edges[i]=edges[j];edges[j]=t;}  }  }  for(i=0;i<n;i++){if(check(edges[i].v1,m)==0 || check(edges[i].v2,m)==0){cout<<edges[i].v1<<"---"<<edges[i].v2<<" "<<edges[i].cost<<endl;if(check(edges[i].v1,m)==0){temp[flag]=edges[i].v1;flag++;}if(check(edges[i].v2,m)==0){temp[flag]=edges[i].v2;flag++;}}}return 0;
}

                                                                     谢谢!

普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法相关推荐

  1. 数据结构与算法(7-3)最小生成树(普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法)

    目录 一.最小生成树简介 二.普里姆算法(Prim) 1.原理 2.存储 2-1.图顶点和权: 2-3. 最小生成树: 3.Prim()函数 3-1.新顶点入树 3-2.保留最小权 3-3. 找到最小 ...

  2. 算法之克鲁斯卡尔(Kruskal)算法

    克鲁斯卡尔(Kruskal)算法 克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法. 基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路 具体做法:首先 ...

  3. 【算法】克鲁斯卡尔 (Kruskal) 算法

    目录 1.概述 2.代码实现 2.1.并查集 2.2.邻接矩阵存储图 2.3.邻接表存储图 2.4.测试代码 3.应用 本文参考: <数据结构教程>第 5 版 李春葆 主编 1.概述 (1 ...

  4. 【数据结构与算法】克鲁斯卡尔(Kruskal)算法

    一,应用场景 公交站问题 1)某城市新增7个站点(A,B,C,D,E,F,G),现在需要修路把7个站点连通 2)各个站点的距离用边线表示(权),比如 A - B距离12公里 3)问:如何修路保证各个站 ...

  5. 一文带你弄懂普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法

    Prim算法 Prim算法用于构造最小生成树,且适用于稠密图. 基本思想 : 归并顶点 设连通网络 N = { V, E } 从某顶点 u0 出发, 选择与它关联的具有最小权值的边(u0, v), 将 ...

  6. 普里姆算法(Prim)和克鲁斯卡尔(Kruskal)算法

    普里姆算法(Prim)和克鲁斯卡尔(Kruskal)算法 普里姆算法的基本思想: 取图中任意一个顶点 v 作为生成树的根,之后往生成树上添加新的顶点 w.添加顶点w的条件为:w 和已在生成树上的顶点v ...

  7. 【数据结构】克鲁斯卡尔(Kruskal)算法 —PK— 普里姆(Prim)算法

    目录 一.克鲁斯卡尔(Kruskal)算法 二.普里姆(Prim)算法 三.两个算法对比 求图的最小生成树的典型算法: 克鲁斯卡尔(Kruskal)算法 普里姆(Prim)算法 注:考虑问题的出发点相 ...

  8. 算法:通过克鲁斯卡尔(Kruskal)算法,求出图的最小生成树

    之前我给大家分享过用普利姆(Prim)算法来求出图的最小生成树(点我去看看),今天我再给大家分享一个也是求图的最小生成树的克鲁斯卡尔(Kruskal)算法 克鲁斯卡尔(Kruskal)算法,就相当于先 ...

  9. 对下图所示的连通网络G,用克鲁斯卡尔(Kruskal)算法求G的最小生成树T,请写出在算法执行过程中,依次加入T的边集TE中的边。说明该算法的基本思想及贪心策略,并简要分析算法的时间复杂度

    对下图所示的连通网络G,用克鲁斯卡尔(Kruskal)算法求G的最小生成树T,请写出在算法执行过程中,依次加入T的边集TE中的 边.说明该算法的基本思想及贪心策略,并简要分析算法的时间复杂度

最新文章

  1. 国内用得最多的框架,它排第一!
  2. 搜索巨头争夺本地搜索市场
  3. Js选择器方法汇总之Salesforce常用
  4. 新闻发布项目——业务逻辑层(UserService)
  5. c++ 字符串拼接_字符串拼接新姿势:StringJoiner
  6. Java毕设项目:垃圾分类(带源码和搭建过程)
  7. [VNC] 云服务器 Ubuntu 配置 VNC 遇到的问题
  8. 蓝桥杯 ADV-171 算法提高 身份证号码升级
  9. python TCP通信,主从服务设计(通过json进行数据通信)
  10. 一个屌丝程序猿的人生(三十六)
  11. 推荐10个免费实用的资源网站,值得收藏
  12. 做人,别伤人,别骗人,别负人!
  13. 边缘计算(雾计算)——AI+IoT的热词
  14. Csharp 简单操作Word模板文件
  15. 微信支付企业付款的php开发实例
  16. 杨毅-kafka集群部署
  17. wordcloud出错_我在安装wordcloud时出错
  18. MTK,4G全网通模块设计资料
  19. python 将json字符串格式数据格式化保存到本地文件
  20. 文件批量随机重命名的五种方式,分享操作步骤

热门文章

  1. 骗了全世界130年的钻石骗局 终于栽在中国
  2. 批量修改数据表字段结构,批量查询相同数据类型的表
  3. 首款鸿蒙手机,华为首款鸿蒙手机入网:不是P50系列
  4. 标普全球普氏推出区块链网络追踪阿联酋的石油数据
  5. powerdesigner 16.6 安装及破解
  6. Leetcode典型题解答和分析、归纳和汇总——T46(全排列)
  7. Powerbuilder编程过程中的 DataWindow 数据窗口函数
  8. 全国计算机等级三级数据库技术知识点
  9. [精华] SCO UNIX安装参考
  10. 如何开启Direct3D