普里姆(Prim)算法

作者:追风剑情 发布于:2014-10-12 15:42 分类:Algorithms

最小生成树算法

开发工具 Visual Studio2010

开发语言 C++

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. const int MAXVEX = 7;//最大顶点数
  5. const int INF = 429496729;//无路径时的权值
  6.  
  7. /**
  8. * 图的最小生成树
  9. * 普里姆(Prim)算法——适合稠密图
  10. */
  11. void Prim(int cost[][MAXVEX], int n, int v)
  12. {
  13. int lowcost[MAXVEX], min;
  14. int closest[MAXVEX], i, j, k;
  15. //给lowcost[]和closest[]置初值
  16. for(i=0; i<n; i++){
  17. lowcost[i] = cost[v][i];
  18. closest[i] = v;
  19. }
  20.  
  21. for(i=1; i<n; i++){//找出n-1个顶点
  22. min = INF;
  23. //在V-U中找出离U最近的顶点k
  24. for(j=0; j<n; j++){
  25. if(lowcost[j] != 0 && lowcost[j] < min){
  26. min = lowcost[j];
  27. k = j;
  28. }
  29. }
  30. printf("边(%d, %d)权为:%d\n", closest[k], k, min);
  31. lowcost[k] = 0;//标记k已经加入U
  32.  
  33. //修改数组lowcost和closest
  34. for(j=0; j<n; j++){
  35. if(cost[k][j] != 0 && cost[k][j] < lowcost[j]){
  36. lowcost[j] = cost[k][j];
  37. closest[j] = k;
  38. }
  39. }
  40. }
  41. }
  42.  
  43. void main()
  44. {
  45. //定义一个代价矩阵作为测试数据 INF:无路径
  46. int cost[MAXVEX][MAXVEX] = {
  47. {0, 50, 60, INF, INF, INF, INF},
  48. {50, 0, INF, 65, 40, INF, INF},
  49. {60, INF, 0, 52, INF, INF, 45},
  50. {INF, 65, 52, 0, 50, 30, 42},
  51. {INF, 40, INF, 50, 0, 70, INF},
  52. {INF, INF, INF, 30, 70, 0, INF},
  53. {INF, INF, 45, 42, INF, INF, 0 }
  54. };
  55.  
  56. printf("最小生成树:\n");
  57. Prim(cost, MAXVEX, 0);
  58.  
  59. system("pause");
  60. }

prim.png

标签: Algorithms

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号