貪心演算法--最小耗費生成樹(Prim演算法)
阿新 • • 發佈:2019-01-06
給一個含權連通無向圖G=(V,E),V={1,2,3,...n};找出最小生成樹.
實現程式碼如下:
#include <stdio.h> #define M 7 #define MAX 999999 int T[M][M]={0}; //記錄最小生成樹的邊 int X[M]={0}; //記錄最小生成數中的頂點 int Y[M]={0}; //記錄最下生成樹之外的頂點 int N[M]={0}; //記錄最小生成樹中每個點被連線的頂點 int C[M]={0};//記錄最小生成樹之外的每個點距離最小生成樹的距離 int c[M][M]={0}; //記錄圖 int getMin(); void PRIM(); int main(void) { int i=0,j=0; for(i=0;i<M;i++) for(j=0;j<M;j++) c[i][j] = MAX; c[1][2] = 1,c[2][1] = 1; c[1][3] = 2,c[3][1] = 2; c[2][3] = 6,c[3][2] = 6; c[2][4] = 11,c[4][2] = 11; c[3][4] = 9,c[4][3] = 9; c[3][5] = 13,c[5][3] = 13; c[4][5] = 7,c[4][6] = 3; c[5][4] = 7,c[6][4] = 3; c[5][6] = 4,c[6][5] = 4; PRIM(); for(i=1;i<M;i++) { for(j=1;j<M;j++) { if(T[i][j]) printf("%d---%d\n",i,j); } } return 0; } void PRIM() { int i=0,j=0,k=0; X[1] = 1; for(i=2;i<M;i++) Y[i] = 1; for(i=2;i<M;i++) { if(c[i][1]) { N[i] = 1; C[i] = c[i][1]; } else C[i] = MAX; } for(i=2;i<M;i++) { j = getMin(); T[N[j]][j] = 1; X[j] = 1; Y[j] = 0; for(k=2;k<M;k++) { if(c[k][j]&&c[j][k]<C[k]) { N[k] = j; C[k] = c[k][j]; } } } } int getMin() { int i=0,j=MAX; int min = MAX; for(i=2;i<M;i++) { if(Y[i]&&min>C[i]) { min = C[i]; j = i; } } return j; }