1. 程式人生 > 實用技巧 >圖的最小生成樹,普利姆演算法

圖的最小生成樹,普利姆演算法

//Prim演算法生成最小生成樹
void MiniSpanTree_prim(MGraph G)
{
    int min, i, j, k;
    int adjvex[MAXVEX];        //儲存相關頂點下標
    int lowcost[MAXVEX];    //儲存相關頂點間邊的權值
    lowcost[0] = 0;    //初始化第一個權值為0,即將v0加入生成樹
    //lowcost的值為0表示此下標的頂點已經加入生成樹
    adjvex[0] = 0;    //初始化第一個頂點下標為0
    for (i = 1; i < G.numVertexes;i++)
    {
        lowcost[i] = G.arc[0][i];    //將v0頂點與之有關的邊的權值都存放入權值陣列
        adjvex[i] = 0;    //初始化都為v0的下標
    }

    for (i = 1; i < G.numVertexes;i++)
    {
        min = INFINITY;
        j = 1;
        k = 0;
        while (j<G.numVertexes)
        {
            if (lowcost[j]!=0&&lowcost[j]<min)
            {
                //如果權值不為0且權值小於min
                min = lowcost[j];    //則讓當前權值成為最小值
                k = j;    //將當前最小值的下標存放k
            }
            j++;
        }
        printf("(%d,%d)", adjvex[k], k);    //列印當前頂點邊中權值最小邊
        lowcost[k] = 0;//將當前頂點的權值置為0,表示此頂點已經完成任務

        //和上面做了幾乎一樣的操作,就是更新權值
        for (j = 1; j < G.numVertexes;j++)    //迴圈所有頂點,因為我們已經確認第一個放入的0,所有我們迴圈可以省去0
        {
            if (lowcost[j] != 0 && G.arc[k][j]<lowcost[j]) //如果j頂點還沒找到“與j頂點相連的最小邊權值的頂點k2” 且 當前k頂點與j頂點邊權值小於之前的"j頂點與k1頂點的邊權值" 
            {                                      
                lowcost[j] = G.arc[k][j];    //將較小權值存入lowcost,表明頂點j與k相連的邊權值;
                adjvex[j] = k;        //將下標為k的頂點存入adjvex,表明頂點j與k相連;
            }
        }
    }
}

程式碼作者:山上有風景
----部落格:https://www.cnblogs.com/ssyfj/p/9488723.html

以下為例項圖片和陣列:
PS:暫時沒時間畫圖,有空再搞