帶權連通圖的最小生成樹——Kruskal算法的理解

    PRIM 和 KRUSKAL 的區別 
    1.  單位不同 Prim  以點為單位 以邊為判定條件 找出  代價最小的點。 KRUSKAL 是以 邊的為單位 ,以點為 判定條件找出可用的邊
   2.  算法的數據結構不同, PRIM 針對的是 鄰接矩陣  ,Kruskal  針對 是 邊集數組

1. 把所有權值的邊進行排序

2. 找出最小權值最小的邊,記錄此時連接的點

3. 繼續尋找 下個權值最小的邊,如果 此時形成的圖沒有環,此邊就生效,并記錄心新連接的點

4. 重復上述步驟 ,直到連接了所有的邊

9fb316cd967dc54ff48dd62a2719aeb0.jpg
void MiniSpanTree_kursKal(MGraph G)
{

   int find(int * parent,int f);

   int  i,n,m,maxedges;
    maxedges= MAXVEX*(MAXVEX-1)/2;

    Edge edges[maxedges];
    int parent[MAXVEX];

    for(i=0;i<G.numVertexes;i++)
    {
         parent[i]=0;


    }

    for (i = 0; i <G.numEdeges ; ++i)
    {
         n= find(parent,edges[i].start);
         m=find(parent,edges[i].end);

        if(n!=m)
        {
             parent[n]=m;

        }

    }


    int  find(int * parent, int f)
    {
        while(parent[f]>0)
        {
            f=parent[f];
        }
        return  f;

    }


}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容