图是一种基础又重要的数据结构,图的生成树是图的一个极小连通子图。最小生成树是无向连通网的所有生成树中边的权值之和最小的一棵生成树。求图的最小生成树可以牵引出很多经典的题目,例如在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. WebSocket 集群解决方案
  2. 加强版Redis,又一款国产高性能KV存储数据库开源了!
  3. (20/24) webpack实战技巧:watch实现热打包和添加代码备注
  4. javascript 垃圾回收机制--分代式垃圾回收机制
  5. mysql分库分表事务控制_数据库分库分表之后,你是如何解决事务问题?
  6. js高级—tab栏切换(面向对象做法)
  7. 深入浅出VC++串口编程之基于Win32 API
  8. Mysql连接失败报Received fatal alert: protocol_version问题解决
  9. 发现Tensorflow
  10. 国内首家VR虚拟现实主题公园即将在北京推出
  11. 笔记:Chrome 对浏览器的改进
  12. java高手之路上的必备基础知识
  13. HDU-1013-Digital root
  14. Python_将conda里的环境导入到pychram中
  15. 2003服务器系统驱动精灵,万能驱动助理 e驱动 6.1.2014.0516 for XP/win2003 32位专版
  16. 在Qt中解决word书签中只能从其后面插入文本的问题
  17. 网络-DNS域名系统详解与DNS攻击
  18. 微信小店二次开发_怎么吧微信小店装修的更好看
  19. 计算机uc,UC浏览器
  20. 把圆形放入矩形的Packing问题

热门文章

  1. 利用计算机发布调度命令时必须严格遵守,复习题行车规章复习题
  2. C#采集麦克风话筒声音
  3. 用 shell 语言提取文件中的信息到另一个文件夹中
  4. 如何选择合适的电烙铁
  5. 十大护眼灯品牌什么牌子好?盘点护眼灯品牌排行前十名
  6. 实战中收藏已久的Linux命令
  7. 【论文翻译】 BMN: Boundary-Matching Network for Temporal Action Proposal Generation
  8. 房地产结构性兼并潮到来
  9. 技巧3 vue3项目 axios前后端交互 图片地址拼接方法
  10. python小游戏大合集(有注释,持续更新)