最小生成树(普里姆)

 1 #include<stdio.h>

 2 #include<stdlib.h>

 3 #define OK 1

 4 #define TRUE 1

 5 #define FALSE 0

 6 #define ERROR -1

 7 #define OVERFLOW -2

 8 #define INFINITY 65535 

 9 #define MAX_VERTEX_NUM 20

10 typedef int Status;

11 typedef char TreeType;

12 //定义邻接矩阵数据结构 

13 typedef struct

14 {

15     TreeType vexs[MAX_VERTEX_NUM];

16     int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

17     int vexnum,arcnum;

18 }MGraph;

19 Status CreateMGraph(MGraph &G)//构造一个图型存储结构 

20 {

21     int i,j,k;

22     puts("请输入构成图的顶点个数和边数:"); 

23     scanf("%d%d%*c",&G.vexnum,&G.arcnum);

24     puts("请输入顶点数值:"); 

25     for(i=0;i<G.vexnum;i++)

26        scanf("%c",&G.vexs[i]);

27     for(i=0;i<G.vexnum;i++)

28         for(j=0;j<G.vexnum;j++)

29         if(i==j) G.arcs[i][j]=0;

30         else G.arcs[i][j]=INFINITY;

31     puts("请依次输入边(Vi,Vj)的顶点序号及权值:");

32     for(k=0;k<G.arcnum;k++)

33     {

34         scanf("%d%d",&i,&j);

35         scanf("%d",&G.arcs[i][j]);

36         G.arcs[j][i]=G.arcs[i][j];

37     }

38     return OK;

39 }

40 Status MiniSpanTree_Prim(MGraph G)

41 {

42     int min,i,j,k,minLength;

43     int adjvex[MAX_VERTEX_NUM],lowcost[MAX_VERTEX_NUM];

44     lowcost[0]=adjvex[0]=minLength=0;

45     for(i=1;i<G.vexnum;i++)

46     {

47         lowcost[i]=G.arcs[0][i];

48         adjvex[i]=0;

49     }

50     puts("最小生成树为:");

51     for(i=1;i<G.vexnum;i++)

52     {

53         min=INFINITY;

54         for(j=1,k=0;j<G.vexnum;j++)

55         if(lowcost[j]&&lowcost[j]<min)

56         {

57             min=lowcost[j];

58             k=j;

59         }

60         minLength+=G.arcs[adjvex[k]][k];

61         printf("(%d,%d) ",adjvex[k],k);

62         for(lowcost[k]=0,j=1;j<G.vexnum;j++)

63         if(lowcost[j]&&G.arcs[k][j]<lowcost[j])

64         {

65             lowcost[j]=G.arcs[k][j];

66             adjvex[j]=k;

67         }

68     }

69     printf("\n最小生成树的长度为:\n%d\n",minLength);

70     return OK;

71 }

72 Status main()

73 {

74     MGraph G;

75     CreateMGraph(G);

76     MiniSpanTree_Prim(G); 

77     system("pause");

78     return OK; 

79 }

你可能感兴趣的:(最小生成树)