普里姆算法

  1. #include <stdio.h>
  2. #define MAXVEX 100
  3. #define INF 32767 /*INF表示∞*/
  4. void Prim(int cost[][MAXVEX],int n,int v)
  5. /*输出最小生成树的每条边*/
  6. {
  7. int lowcost[MAXVEX],min;
  8. int closest[MAXVEX],i,j,k;
  9. for (i=0;i<n;i++) /*给lowcost[]和closest[]置初值*/
  10. {
  11. lowcost[i]=cost[v][i];
  12. closest[i]=v;
  13. }
  14. for (i=1;i<n;i++) /*找出n-1个顶点*/
  15. {
  16. min=INF;
  17. for (j=0;j<n;j++) /*在(V-U)中找出离U最近的顶点k*/
  18. if (lowcost[j]!=0 && lowcost[j]<min)
  19. {
  20. min=lowcost[j];
  21. k=j;
  22. }
  23. printf(" 边(%d,%d)权为:%d\n",closest[k],k,min);
  24. lowcost[k]=0; /*标记k已经加入U*/
  25. for (j=0;j<n;j++) /*修改数组lowcost和closest*/
  26. if (cost[k][j]!=0 && cost[k][j]<lowcost[j])
  27. {
  28. lowcost[j]=cost[k][j];
  29. closest[j]=k;
  30. }
  31. }
  32. }
  33. void main()
  34. {
  35. int n=7;
  36. int cost[7][MAXVEX]={
  37. {0,50,60,INF,INF,INF,INF},
  38. {50,0,INF,65,40,INF,INF},
  39. {60,INF,0,52,INF,INF,45},
  40. {INF,65,52,0,50,30,42},
  41. {INF,40,INF,50,0,70,INF},
  42. {INF,INF,INF,30,70,0,INF},
  43. {INF,INF,45,42,INF,INF,0}};
  44. printf("最小生成树:\n");Prim(cost,n,0);
  45. }