1. 程式人生 > >Prime演算法——學習筆記

Prime演算法——學習筆記

Prime演算法是圖論中的經典演算法,用於在圖中尋找最小生成樹。Prime演算法的原理在於:

(1)任取一點加入點佇列V

(2)在滿足一端點在點佇列V中,一端點(新節點)不在佇列中的所有邊中尋找最短邊

(3)把新節點加入點佇列V中,把新邊加入邊佇列E

(4)重新執行(2)直到所有點都加入點佇列

以上圖(圖片搜尋自百度圖片)為例

(1)首先任選節點,選擇A節點,發現最短邊AD,加入佇列 V=[A,D];E=[AD]

(2)以V為基礎繼續搜尋,找到DF,加入佇列V=[A,D,F];E=[AD,DF]

(3)找到AB,加入佇列V=[A,D,F,B];E=[AD,DF,AB]

……

(5)找到EG,加入佇列V=[A,D,F,B,E,C,G];E=[AD,DF,AB,BE,EC,EG]

上程式碼:

//邊
struct Edge{
    int start;
    int end;
    int length;
};

//需要傳入圖鄰接矩陣graph,點的個數length
Edge* Fun(int **graph,int length){
    //length個點,(length-1)條邊
    int* V=(int*)calloc(length,sizeof(int));
    Edge* E=(Edge*)malloc((length-1)*sizeof(Edge));
    
    //先設起始點,置1說明入佇列
    V[0]=1;
    
    for(int i=0;i<length-1;i++){
        //尋找滿足要求的最短邊
        for (int j=0,min=INT_MAX; j<length; j++) {
            //判斷當前點是否在點佇列
            if(V[j]>0){
                for(int k=0;k<length;k++){
                    if(V[k]==0&&graph[j][k]<min&&graph[j][k]>0){
                        min=graph[j][k];
                        E[i].start=j;
                        E[i].end=k;
                        E[i].length=min;
                    }
                }
            }
        }
        //把新點加入佇列
        V[E[i].end]=1;
    }
    
    free(V);
    return E;
}