无向连通图的最小生成树

设G=(V,E)是一个无向连通图,生成树上各边的权值之和称为该生成树的代价,在G的所有生成树中,代价最小的生成树即为其最小生成树。

Prim(普里姆)算法的基本思想是:

设 G=(V,E) 是一个无向连通图,令T=(U,TE) 是 G 的最小生成树。T的初始状态为 U={v0}(v0∈V),TE={},然后重复执行下述操作:
                 在所有 u∈U,v∈V-U 的边中找一条代价最小的边(u,v) 并入 U,直至 U=V 为止。此时TE中必有 n-1 条边,T 就是最小生成树。

代码如下:

[cpp] view plaincopy
  1. void MiniSpanTree(MGraph G)
  2. {
  3. int min,i,j,k;
  4. int adjvex[MAXVEX];//保存相关顶点下标
  5. int lowcost[MAXVEX];//保存相关顶点间边的权值
  6. adjvex[0] = 0;//初始化第一个顶点下标为0
  7. lowcost[0] = 0;//初始化第一个权值为0,即Vo加入生成树
  8. //lowcost的值为0,表示此下标的顶点已经加入生成树
  9. for (i = 1; i < G.vertexNum; i++)//循环除0外的全部顶点
  10. {
  11. lowcost[i] = G.arc[0][i];//将Vo顶点与之有边的权值存入数组
  12. adjvex[i] = 0;//初始化都为Vo的下标
  13. }
  14. for (i = 1; i < G.vertexNum; i++)
  15. {
  16. min = INFINITE;//初始最小值为极大∞
  17. j = 1;
  18. k = 0;
  19. while (j < G.vertexNum)//循环全部顶点
  20. {
  21. if (lowcost[j] != 0 && lowcost[j] < min)//如果权值不为0且小雨min
  22. {
  23. min = lowcost[j];//让当前权值成为最小值
  24. k = j;//将当前最小值的下标存入k
  25. }
  26. j++;
  27. }
  28. printf("(%d,%d)",adjvex[k],k);//输出当前顶点边中权值最小边
  29. lowcost[k] = 0;//0表示该顶点已完成
  30. for (j = 1; j < G.vertexNum; j++)//循环所有顶点
  31. {
  32. //若下标为k的顶点的各边权值小于此前这些顶点未被加入生成树的权值
  33. if (lowcost[j] != 0 && G.arc[k][j] < lowcost[j])
  34. {
  35. lowcost[j] = G.arc[k][j];//将较小权值存入lowcost
  36. adjvex[j] = k;//将下标为k的顶点存入adjvex
  37. }
  38. }
  39. }
  40. }

Kruskal(克鲁斯卡尔)算法的基本思想是:

基本思想:设无向连通网为 G=(V, E),令 G 的最小生成树为 T=(U, TE),其初态为 U=V,TE={ },然后,按照边的权值由小到大的顺序,考察 G 的边集E中的各条边。若被考察的边的两个顶点属于T的两个不同的连通分量,则将此边作为最小生成树的边加入到T中,同时把两个连通分量连接为一个连通分量;若被考察边的两个顶点属于同一个连通分量,则舍去此边,以免造成回路,如此下去,当T中的连通分量个数为1时,此连通分量便为 G 的一棵最小生成树。

代码如下:

[cpp] view plaincopy
  1. /对边集数组Edge结构的定义
  2. typedef struct
  3. {
  4. int begin;
  5. int end;
  6. int weight;
  7. }Edge;
  8. void MiniSpanTree(MGraph G)
  9. {
  10. int i,n,m;
  11. Edge edges[MAXEDGE];//定义边集数组
  12. int parent[MAXVEX];//定义一数组用来判断边与边是否形成环路
  13. //此处省略将邻接矩阵G转化为边集数组edges并按权值由小到大排序的代码
  14. for (i = 0; i < G.vertexNum; i++)
  15. parent[i] = 0;//初始化为0
  16. for (i = 0; i < G.edgeNum; i++)//循环每一条边
  17. {
  18. n = Find(parent,edges[i].begin);
  19. m = Find(parent,edges[i].end);
  20. if (n != m)//假如n与m不相等,说明此边没有与现有的生成树形成环路
  21. {
  22. parent[n] = m;//将此边的结尾顶点放入下标为起点的parent中,表示此顶点已经在生成树中
  23. printf("(%d,%d) %d ",edges[i].begin,edges[i].end,edges[i].weight);
  24. }
  25. }
  26. }
  27. int Find(int * parent,int x)//查找连线顶点的尾部下标
  28. {
  29. while (parent[x] > 0)
  30. x = parent[x];
  31. return x;

最小生成树算法(Prim和Kruskal)相关推荐

  1. 【恋上数据结构】图代码实现、最小生成树(Prim、Kruskal)、最短路径(Dijkstra、Bellman-Ford、Floyd)

    图 最小生成树(Minimum Spanning Tree) Prim算法 切分定理 Prim算法 – 执行过程 Prim算法 – 代码实现 Kruskal算法 Kruskal算法 – 执行过程 Kr ...

  2. Java实现最小生成树算法(Prim算法)

    Prim算法 Prim算法,每一步都会为一颗生长中的树添加一条边.一开始这棵树只有一个顶点,然后哦会向它添加V-1条边,每次总是将下一条连接树的顶点与不在树中且权重最小的边加入树中 实现 最小生成树的 ...

  3. #最小生成树,prim,kruskal#poj 2560 Freckles 雀斑

    题目 求最小生成树 分析 prim & kruskal Kruskal代码 #include <cstdio> #include <cmath> #include &l ...

  4. hdu 1233 还是畅通工程(最小生成树的Prim和Kruskal两种算法的c++实现)(prim算法详解)...

    赤裸裸滴最小生成树(MST),刚学的玩意,用两种方法熟练一下.(都是greedy) Kruskal方法:先对边按照代价非递减排序,再不断添加边且不产生环路,当边数=点数-1结束.判断加入(v,w)是否 ...

  5. 【数据结构与算法python】最小生成树算法-Prim算法

    1.引入 本算法涉及到在互联网中网游设计者和网络收音机所面临的问题:信息广播问题,如网游需要让所有玩家获知其他玩家所在的位置,收音机则需要让所有听众获取直播的音频数据 2.算法介绍 (1)单播解法 信 ...

  6. 图的最小生成树和最短路径算法思路总结(Prim,Kruskal,Dijkstra,Floyd)

    带权无向图->最小生成树算法->Prim算法: 思路: 首先,我们先设置两个集合,U_{}:一个用来放最小生成树的顶点,T_{}:一个用来放最小生成树的边.选取最开始的点V_0,将V_0放 ...

  7. 技术图文:如何利用C# 实现 Prim 最小生成树算法?

    背景 我们上一篇图文介绍了 如何利用 C# 实现 Kruskal 最小生成树算法?,Kruskal 算法通过寻找边最优的方式来构造最小生成树,本篇图文介绍如何利用 C# 实现 Prim 最小生成树算法 ...

  8. dijkstra算法_Python实现图的经典DFS、BFS、Dijkstra、Floyd、Prim、Kruskal算法

    讲在前面的话,图的算法太多,理论知识肯定一篇文章讲不完,关于理论知识大家可以参考教材Sedgewick的<算法>或reference的链接,本文主要还是想在一篇文章中记录六种算法的Pyth ...

  9. dfs时间复杂度_Python实现图的经典DFS、BFS、Dijkstra、Floyd、Prim、Kruskal算法

    讲在前面的话,图的算法太多,理论知识肯定一篇文章讲不完,关于理论知识大家可以参考教材Sedgewick的<算法>或reference的链接,本文主要还是想在一篇文章中记录六种算法的Pyth ...

  10. `Computer-Algorithm` 最小生成树MST,Prim,Kruskal,次小生成树

    Contents 最小生成树 Algorithm Prim Code Kruskal Prim&KruskalPrim \& KruskalPrim&Kruskal算法的性质 ...

最新文章

  1. Linux 什么时候才能足够完美?
  2. NSArray和NSMutableArray
  3. MATLAB-循环类型相关(for while break continue)
  4. 七年级计算机教学质量分析,七年级数学期末教学质量分析报告
  5. 域名解析中“TTL”是什么意思?
  6. vim文本编辑器的使用
  7. java 开发者异常处理_Java异常处理和设计
  8. 从PHP脚本返回JSON
  9. 强化学习 / 动态规划:策略改进(Policy Improvement)使策略更优的数学证明
  10. 在线阅读各版本android系统源代码
  11. Qt学习之路(21): event()
  12. exchange 2010高可用平台的搭建和配置
  13. 影响世界的77部文学名著
  14. Ubuntu 11.10安装QQ2012
  15. 解决SAS/EG中某些process出现的WARNING: The font Arial is not available. Albany AMT will be used.
  16. excel中多列内容显示不全
  17. 第23课:专项能力修炼
  18. 汽车车门振动变形测量
  19. 360安全卫士如何关闭弹窗广告
  20. 系统备份软件测试,备份软件测试方案

热门文章

  1. Java对象toString()方法
  2. 给你自己的博客加个 Markdown
  3. runloop的mode作用是什么?
  4. linux下安装不同版本的jdk
  5. 【Linux】字符转换命令expand
  6. Thread 编程:简明(1) - 协作式取消 VS 线程终止
  7. 对账不平问题专题讲解内容
  8. C#中索引器的简单使用
  9. WPF利用HelixToolKit后台导入3D模型
  10. HNOI2008 遥远的行星