当前位置:   article > 正文

数据结构——图的最小生成树

图的最小生成树

一、最小生成树的概念

图分为无向图和有向图,其中包括无权,有权(正权负权)图。

 定义:无向带权图G顶点个数为 m ,由G中 m 个点和 m - 1 条边构成的连通子图称为G的一条支撑树,也叫生成树。 边权之和最小的支撑树叫做最小支撑树(MST)。

最小支撑树无回路 

二、算法分析

 1.Prim算法(逐点加入)

Prim算法更适用于稠密图(点少边多)。

过程图解

 

2.Kruskal算法(逐边加入)

利用并查集实现,将每个连通分量看作一个集合,顶点看作集合元素,每次查询一条权值最小的边,查询该边的两端是否在同一个集合内,若不在就将这两个集合合并,将该边加入支撑树中。Kruskal算法更适用于稀疏图(点多边少)。

 过程图解

 

三、求最小支撑树例题——Prim

1. 题目说明

 2. 代码实现

  1. #include<iostream>
  2. using namespace std;
  3. #define WQ 65535//有符号的最大值表示无穷大
  4. int edge[2000][2000];//邻接矩阵
  5. long long sum;//权值之和
  6. int TE[1000];
  7. int lowcost[2000];//最小权值数组
  8. int U[2000];
  9. bool flag = false;
  10. //构建邻接矩阵
  11. void CreatGraph(int n, int e) {
  12. for (int i = 1; i <= n; i++) {
  13. for (int j = 1; j <= n; j++) {
  14. edge[i][j] = WQ;
  15. }
  16. }
  17. for (int k = 0; k < e; k++) {
  18. int a, b, c;
  19. cin >> a >> b >> c;
  20. edge[a][b] = c;
  21. edge[b][a] = edge[a][b];
  22. }
  23. }
  24. void Prim(int n, int e) {
  25. flag = false;
  26. for (int i = 1; i <= n; i++) {
  27. lowcost[i] = edge[1][i];
  28. U[i] = 1;
  29. }
  30. U[1] = -1;
  31. int k = 1;
  32. for (int i = 1; i <= n - 1; i++) {
  33. int v = 0;
  34. int min = WQ;//无穷大
  35. for (int j = 1; j <= n; j++) {
  36. if (U[j] != -1 && lowcost[j] < min) {//初始化
  37. v = j;
  38. min = lowcost[j];
  39. }
  40. }
  41. if (v == 0) {
  42. flag = true;
  43. printf("There is no minimum spanning tree.\n");
  44. return;
  45. //图不连通
  46. }
  47. TE[k] = lowcost[v];
  48. k = k + 1;
  49. lowcost[v] = 0;
  50. U[v] = -1;
  51. for (int j = 1; j <= n; j++) {
  52. if (U[j] != -1 && edge[v][j] < lowcost[j]) {//更新权值
  53. lowcost[j] = edge[v][j];
  54. U[j] = v;
  55. }
  56. }
  57. }
  58. //return 0;
  59. }
  60. //主函数
  61. int main() {
  62. int n;//顶点数
  63. int e;//边数
  64. while (scanf("%d%d", &n, &e) != EOF)
  65. {
  66. CreatGraph(n, e);//构建邻接矩阵
  67. Prim(n, e);
  68. if (flag == false) {
  69. for (int i = 1; i <= e; i++) {
  70. sum += TE[i];
  71. }
  72. cout << sum << endl;
  73. }
  74. }
  75. return 0;
  76. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/243477
推荐阅读
相关标签
  

闽ICP备14008679号