最小生成樹 prim()

/**
    prim算法應該是我學會的第一個圖算法

    最小生成樹,一個無向圖使每兩個點都連通的最小花費,每條邊都會有
    邊權,這個算法在點少邊多的情況下要比kruskal 更有優勢,一般都不多於
    1000個點。

    比如:幾個村莊鋪設電話線,給出了一個圖,圖上描述了每兩個村莊進行連接的花費,
    現在求一種最小花費使每兩個村莊有且僅有一條路徑相連。

    還是那句話,圖算法現成模板太多,關鍵在於把問題轉換成這個模型

    在裏面標記,可得到最小生成樹的形狀,不只是最小權

    有向圖的最小生成樹叫最小樹形圖,我空間裏面有,在前面,比這個複雜點
*/

int map[Max][Max]; // map = inf; 初始化爲正無窮大

int n; //點的個數

int prim() {
    int dis[Max], count = n-1, i, min_edge, min_node;
    for (i=1; i<=n; i++)
        dis[i] = inf;
    int now = s; //設s 爲起點隨便找個 (1 - n)
    int ans = 0;
    while (count--) {
        dis[now] = -1;
        min_edge = inf;
        for (i=1; i<=n; i++) {
            if (now!=i && dis[i] >= 0) {
                dis[i] = min(dis[i], map[now][i]);
                if (dis[i] < min_edge) {
                    min_edge = dis[i];
                    min_node = i;
                }
            }
        }
        now = min_node;
        ans += min_edge;
    }
    return ans;
}

int main() {

    //建好圖 後直接調用

    prim();

    return 0;
}

收藏於 2012-01-08
來自於百度空間

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章