• 普里姆算法

    普里姆算法

    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. }