【数据结构】求最小生成树的权值之和——Prim算法

前端之家收集整理的这篇文章主要介绍了【数据结构】求最小生成树的权值之和——Prim算法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

题源: 北航14级6系数据结构课第四次作业


【问题描述】
已知含有n个顶点的带权连通无向图,采用邻接矩阵存储,邻接矩阵以三元组的形式给出,只给出不包括主对角线元素在内的下三角形部分的元素,且不包括不相邻的顶点对。求该连通图的最小生成树的权值

【输入形式】
第一行给出结点个数n和三元组的个数count,以下每行给出一个三元组,数之间用空格隔开。(注意这里顶点的序号是从1到n,而不是0到n-1,程序里要小心!)
输出形式】
最小生成树的权值
【样例输入】
5 8
2 1 7
3 1 6
3 2 8
4 1 9
4 2 4
4 3 6
5 2 4
5 4 2
【样例输出
18
【样例说明】
权值是正整数,可能很大,但不需要考虑整型溢出问题


【题解&心得】

这个算法就在数据结构书本254页有,基本上就是照抄书就可以了,然后的话要注意的是表达正无穷大的方法


#include<limits.h>

在上面的头文件中包含了很多的极限值

比方说如果是int,那么无穷大可以用INT_MAX来表示

同理,无穷小可以用INT_MIN


最先开始我是用-1表示两个顶点之间的没有边的,但是发现根据算法里面的判定条件,-1就变成了最短的那条边,结果输出来的值就变成了 -n+1

然后我用INT_MAX表示正无穷,输出就是对的了

再一次铭记晏海华老师的警言: 工欲善其事必先利其器!



  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <limits.h>
  4.  
  5. #define MAXVNUM 50
  6.  
  7.  
  8. int getLength ( int Graph[][MAXVNUM],int n );
  9.  
  10. int main()
  11. {
  12. int numV; // number of vertex
  13. int numE; // numver of edge
  14. int Graph[MAXVNUM][MAXVNUM];
  15. int i,j;
  16. int a,b,c;
  17. int length;
  18.  
  19. scanf("%d%d",&numV,&numE);
  20.  
  21. //初始化,-1表示两个顶点之间没有边相连
  22. for( i = 0; i < numV; i++)
  23. for( j = 0; j < numV; j++) {
  24. Graph[i][j] = INT_MAX;
  25. }
  26.  
  27. //构建图的邻接矩阵
  28. for( i = 0; i < numE; i++) {
  29.  
  30. scanf("%d%d%d",&a,&b,&c);
  31. Graph[a-1][b-1] = c;
  32. Graph[b-1][a-1] = c;
  33.  
  34. }
  35.  
  36. length = getLength(Graph,numV);
  37. printf("%d",length);
  38.  
  39. return 0;
  40. }
  41.  
  42. //求最小生成树的带权路径长度
  43. int getLength ( int Graph[][MAXVNUM],int n ) {
  44.  
  45. int lowcost[n];
  46. int teend[n];
  47. int mincost;
  48. int length = 0;//带权路径长度
  49. int i,j,k;
  50. int temp;
  51.  
  52. lowcost[0] = 0;
  53.  
  54. for ( i = 0; i < n; i++) {
  55. teend[i] = 0;
  56. lowcost[i] = Graph[0][i];
  57. }
  58.  
  59. for ( i = 1; i < n; i++ ) {
  60.  
  61. mincost = INT_MAX;
  62.  
  63. j = 1;
  64.  
  65. while ( j < n ) {
  66.  
  67. if ( lowcost[j] > 0 && mincost > lowcost[j] ) {
  68.  
  69. mincost = lowcost[j];
  70. k = j;
  71. }
  72.  
  73. j++;
  74. }
  75.  
  76. temp = teend[k];
  77. length += Graph[k][temp];
  78. lowcost[k] = 0;
  79.  
  80. for( j = 0; j < n; j++ ) {
  81.  
  82. if( Graph[k][j] < lowcost[j] ) {
  83. lowcost[j] = Graph[k][j];
  84. teend[j] = k;
  85. }
  86.  
  87. }
  88.  
  89. }
  90.  
  91. return length;
  92.  
  93. }

猜你在找的数据结构相关文章