プリムアルゴリズム

20195 ワード


 
  1 /*

  2   3                ,             ,              

  4 */

  5 # include <stdio.h>

  6 

  7 typedef char VertexType;//      

  8 typedef int EdgeType;//         

  9 # define MAX_VERTEX 100//      

 10 # define INFINITY 65535// 65535     

 11 

 12 typedef struct

 13 {//        

 14     VertexType vexs[MAX_VERTEX];//   

 15     EdgeType arc[MAX_VERTEX][MAX_VERTEX];//    

 16     int numVertexs, numEdges;//           

 17 

 18 }MGraph;

 19 

 20 void CreateMGraph(MGraph *G)

 21 {

 22     int i, j;

 23     G->numEdges=15;

 24     G->numVertexs=9;

 25 

 26     for (i = 0; i < G->numVertexs; i++)

 27     {

 28         for ( j = 0; j < G->numVertexs; j++)

 29         {

 30             if (i==j)

 31                 G->arc[i][j]=0;

 32             else

 33                 G->arc[i][j] = G->arc[j][i] = INFINITY;

 34         }

 35     }

 36 

 37     G->arc[0][1]=10;

 38     G->arc[0][5]=11; 

 39     G->arc[1][2]=18; 

 40     G->arc[1][8]=12; 

 41     G->arc[1][6]=16; 

 42     G->arc[2][8]=8; 

 43     G->arc[2][3]=22; 

 44     G->arc[3][8]=21; 

 45     G->arc[3][6]=24; 

 46     G->arc[3][7]=16;

 47     G->arc[3][4]=20;

 48     G->arc[4][7]=7; 

 49     G->arc[4][5]=26; 

 50     G->arc[5][6]=17; 

 51     G->arc[6][7]=19; 

 52 

 53     for(i = 0; i < G->numVertexs; i++)

 54     {

 55         for(j = i; j < G->numVertexs; j++)

 56         {

 57             G->arc[j][i] =G->arc[i][j];

 58         }

 59     }

 60 

 61 }

 62 

 63 void MinSpanTree_Peim (MGraph &G)

 64 {//

 65     int min, i, j, k;

 66     int add=0;

 67     int adjvex[MAX_VERTEX];

 68     int lowcost[MAX_VERTEX];

 69     lowcost[0] = 0;

 70     adjvex[0] = 0;

 71 

 72     for (i=1; i<G.numVertexs; i++)

 73     {//   v0      ,   v0        lowcost   ,adjvex     0;

 74         lowcost[i] = G.arc[0][i];//         

 75         adjvex[i] = 0;//    0

 76     }

 77 

 78     for (i=1; i<G.numVertexs; i++)

 79     {//     

 80         min = INFINITY;//   

 81         j=1;

 82         k=0;

 83 

 84         while (j < G.numVertexs)

 85         {//  lowcost       ,       min,         k

 86             if (lowcost[j]!=0 && lowcost[j]<min)

 87             {

 88                 min = lowcost[j];//       

 89                 k = j;//            

 90             }

 91             j++;

 92         }

 93         printf ("(%d——%d)
", adjvex[k], k); 94 add = add + G.arc[adjvex[k]][k]; 95 /* 52~56 adjvex 0, 0, lowcost 96 ( ), lowcost , lowcost */ 97 lowcost[k] = 0; 98 // 1(k=1), for 1 99 for (j=1; j<G.numVertexs; j++) 100 {// lowcost lowcos 。 101 // 102 if (lowcost[j]!=0 && G.arc[k][j]<lowcost[j])//t 103 { 104 lowcost[j] = G.arc[k][j];//0 105 adjvex[j] = k; 106 } 107 } 108 } 109 printf ("%d
", add); 110 111 return; 112 } 113 114 int main (void) 115 { 116 MGraph G; 117 CreateMGraph (&G); 118 MinSpanTree_Peim (G); 119 120 return 0; 121 } 122 123 /* 124 vc++6.0 : 125 :9 15 126 1 :v0 127 2 :v1 128 3 :v2 129 4 :v3 130 5 :v4 131 6 :v5 132 7 :v6 133 8 :v7 134 9 :v8 135 (vi,vj) i, j w:0 1 10 136 (vi,vj) i, j w:0 5 11 137 (vi,vj) i, j w:1 6 16 138 (vi,vj) i, j w:1 2 18 139 (vi,vj) i, j w:1 8 12 140 (vi,vj) i, j w:2 8 8 141 (vi,vj) i, j w:2 3 22 142 (vi,vj) i, j w:8 3 21 143 (vi,vj) i, j w:6 5 17 144 (vi,vj) i, j w:6 3 24 145 (vi,vj) i, j w:6 7 19 146 (vi,vj) i, j w:3 4 20 147 (vi,vj) i, j w:3 7 16 148 (vi,vj) i, j w:4 7 7 149 (vi,vj) i, j w:4 5 26 150 (0——1) 151 (0——5) 152 (1——8) 153 (8——2) 154 (1——6) 155 (6——7) 156 (7——4) 157 (7——3) 158 Press any key to continue 159 160 */