这题用prim算法解决最小生成树的思想与用dijkstra算法解决最段路径的思想几乎完全相同,可以看看我上一篇关于dijkstra算法的文章,谢谢。

好了,话不多说,代码搞起来。

  1. #include<iostream>
  2. using namespace std;
  3. const int N = 50;
  4. const int INF = 100000000;
  5. int Graph[N][N];
  6. int d[N];
  7. bool visit[N];
  8. int n;
  9. //普利姆算法适合求解提供源点的算法
  10. //将最小生成树的所有点看作一个集合,里面的每一个点都属于这个集合
  11. //生成最小生成树的过程就是把点一个一个加入集合的过程。
  12. int prim(int s)
  13. {
  14. d[s] = 0;//更新源点的距离
  15. int ans = 0;//最小生成树的权值之和
  16. for (int i = 0; i < n; i++)
  17. {
  18. int min = INF;
  19. int index = -1;
  20. for (int j = 0; j < n; j++)
  21. {
  22. if (visit[j] == false && d[j] < min)
  23. {
  24. min = d[j];
  25. index = j;
  26. }
  27. }
  28. if (index == -1)
  29. {
  30. return INF;//此图不连通
  31. }
  32. visit[index] = true;
  33. ans += d[index];
  34. for (int k=0;k<n;k++)
  35. {
  36. if (visit[k] == false &&d[k]>Graph[index][k])
  37. {
  38. d[k] = Graph[index][k];//这就是不同点,更新点到集合的最小距离即可
  39. }
  40. }
  41. }
  42. return ans;
  43. }
  44. int main()
  45. {
  46. cin >> n;
  47. for (int i = 0; i < n; i++)
  48. {
  49. for (int j = 0; j < n; j++)
  50. {
  51. cin >> Graph[i][j];
  52. if (Graph[i][j] == 0)
  53. {
  54. Graph[i][j] = INF;
  55. }
  56. }
  57. }
  58. //如果原来的图里面任何两条边长都不相同,那么最小生成树是唯一的,
  59. //此时不管用什么方法算出来的都是一样的。但是如果图里有相等的边,
  60. //那么最小生成树可能不唯一,这样就无法保证不同的方法得到同一棵树
  61. //(即使是同一个算法,只内要图的编号方式改变也容可能得到不同的最小生成树)
  62. //所以在这里,我们运用循环 把每一个点当成源点,计算最小生成树的权值之和
  63. int ans;
  64. int min = INF;
  65. for (int i = 0; i < n; i++)
  66. {prim算法适合给你源点,这里没有需要我们自己来
  67. 每一次都要把visitd数组更新
  68. for (int i = 0; i < n; i++)
  69. {
  70. visit[i] = false;
  71. d[i] = INF;
  72. }
  73. ans = prim(i);
  74. 取最小值输出
  75. if (ans < min)
  76. {
  77. min = ans;
  78. }
  79. }
  80. cout << min << endl;
  81. return 0;
  82. }
点赞(0)
 

9.9 分

2 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论