Prim算法

普利姆算法,是一種經常使用的求最小生成樹的算法。算法

最小生成樹,使得一個連通圖內擁有最小的和。對現實生活中有極大的做用。ide

主要思路

1 選定一個頂點(與結果無關)spa

2 尋找與這個頂點相連的最小權值的鄰居code

while(j<MAXSIZE){  //尋找生成樹相連的最小權值的頂點
            if(lowcost[j]!=0  && lowcost[j] < min){ min = lowcost[j]; k = j; } j++; }

3 把這個鄰居,加入到最小生成樹集合中。blog

4 在此新加入的頂點基礎上,尋找與該集合相連的最小權值的鄰居。重複2。it

for(j=1;j<MAXSIZE;j++){ if(lowcost[j]!=0 && g->arc[k][j] < lowcost[j]){ lowcost[j] = g->arc[k][j]; ver[j] = k; } }

5 直到全部頂點都存在於該集合中io

算法代碼

 1 void Prim(Graph *g){  2     int min,i,j,k;  3     int ver[MAXSIZE];  4     int lowcost[MAXSIZE];  5     lowcost[0] = 0;  6     ver[0] = 0;  7     for(i=1;i<MAXSIZE;i++){  8         lowcost[i] = g->arc[0][i];  9         ver[i] = 0; 10  } 11     for(i=1;i<MAXSIZE;i++){ 12         min = INF; 13 
14         j=1; 15         k=0; 16 
17         while(j<MAXSIZE){  //尋找生成樹相連的最小權值的頂點
18             if(lowcost[j]!=0  && lowcost[j] < min){ 19                 min = lowcost[j]; 20                 k = j; 21  } 22 
23             j++; 24  } 25 
26         printf("(%d , %d)\n",ver[k],k); 27 
28         lowcost[k] = 0; 29 
30         for(j=1;j<MAXSIZE;j++){ 31             if(lowcost[j]!=0 && g->arc[k][j] < lowcost[j]){ 32                 lowcost[j] = g->arc[k][j]; 33                 ver[j] = k; 34  } 35 
36  } 37  } 38 }

示例代碼

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define MAXSIZE 9
 4 #define INF 65535
 5 typedef struct Graph{  6     int arc[MAXSIZE][MAXSIZE];  7 }Graph;  8 
 9 void initGraph(Graph *g); 10 void showGraph(Graph *g); 11 void Prim(Graph *g); 12 
13 int num[MAXSIZE][MAXSIZE]={ 0,  10, INF,INF,INF,11, INF,INF,INF, 14                 10, 0,  18, INF,INF,INF,16, INF,12, 15                 INF,INF,0,  22, INF,INF,INF,INF,8, 16                 INF,INF,22, 0,  20, INF,INF,16, 21, 17                 INF,INF,INF,20, 0,  26, INF,7, INF, 18                 11, INF,INF,INF,26, 0,  17, INF,INF, 19                 INF,16, INF,INF,INF,17, 0,  19, INF, 20                 INF,INF,INF,16, 7,  INF,19, 0, INF, 21                 INF,12, 8,  21, INF,INF,INF,INF,0}; 22 int main() 23 { 24     Graph *g = (Graph *)malloc(sizeof(Graph)); 25  initGraph(g); 26  showGraph(g); 27     printf("\n\n"); 28  Prim(g); 29 
30     return 0; 31 } 32 
33 void initGraph(Graph *g){ 34    int i,j; 35    for(i=0;i<9;i++){ 36         for(j=0;j<9;j++){ 37             g->arc[i][j]=num[i][j]; 38  } 39  } 40 } 41 void showGraph(Graph *g){ 42     int i,j; 43     for(i=0;i<9;i++){ 44         for(j=0;j<9;j++){ 45             printf("%d ",g->arc[i][j]); 46  } 47         printf("\n"); 48  } 49 } 50 
51 void Prim(Graph *g){ 52     int min,i,j,k; 53     int ver[MAXSIZE]; 54     int lowcost[MAXSIZE]; 55     lowcost[0] = 0; 56     ver[0] = 0; 57     for(i=1;i<MAXSIZE;i++){ 58         lowcost[i] = g->arc[0][i]; 59         ver[i] = 0; 60  } 61     for(i=1;i<MAXSIZE;i++){ 62         min = INF; 63 
64         j=1; 65         k=0; 66 
67         while(j<MAXSIZE){  //尋找生成樹相連的最小權值的頂點
68             if(lowcost[j]!=0  && lowcost[j] < min){ 69                 min = lowcost[j]; 70                 k = j; 71  } 72 
73             j++; 74  } 75 
76         printf("(%d , %d)\n",ver[k],k); 77 
78         lowcost[k] = 0; 79 
80         for(j=1;j<MAXSIZE;j++){ 81             if(lowcost[j]!=0 && g->arc[k][j] < lowcost[j]){ 82                 lowcost[j] = g->arc[k][j]; 83                 ver[j] = k; 84  } 85 
86  } 87  } 88 }
View Code

運行結果

相關文章
相關標籤/搜索