模板-prim

描述

普里姆算法(Prim算法),圖論中的一種算法,可在加權連通圖裏搜索最小生成樹。意即由此算法搜索到的邊子集所構成的樹中,不但包括了連通圖裏的所有頂點(英語:Vertex (graph theory)),且其所有邊的權值之和亦爲最小。

時間複雜度:O(n^2)
int prim(int n)
{
    int total_weight = 0;
    memset(dist, INF, sizeof(dist));
    memset(vis, false, sizeof(vis));
    dist[0] = 0;
    //從編號爲0的節點開始遍歷,0節點到0節點的距離爲零
    //將0節點加入最小生成樹
    for(int i = 0; i < n; i ++)
    {
        int min_dist = INF, min_vertex;
        for(int j = 0; j < n; j ++)
        {

            if(!vis[j] && min_dist > dist[j])
            {
                min_vertex = j;
                min_dist = dist[j];
            }
        }
        //將選出來的邊加入最小生成樹
        vis[min_vertex] = true;
        total_weight += min_dist;

        for(int j = 0; j < n; j ++)
        {
            //找出距離當前節點距離最小的頂點,且未訪問
            if(!vis[j] && data[min_vertex][j] < dist[j])
            {
                dist[j] = data[min_vertex][j];
            }
        }
    }
    return total_weight;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章