floyed 算法

/**
    floyed 是用動態規劃解決完全最短路的算法,一次調用即可得到任意兩個點間的最短路徑
    複雜度爲O(n^3),適用於稠密圖,頂點數一般在100 以內適用

    結構簡單,易於編寫

    floyed算法還可解決傳遞閉包,判斷圖是否爲連通圖

    在解題時候一般不會只考 floyed 而是利用floyed 得到的結果,進行下一步解題
    就像二分算法一樣,提一下競賽必考二分枚舉
*/

const int inf = 0x3f3f3f3f;
const int M = 100;

int map[M][M]; //初始化map[][] = inf;

void addEdge(int u, int v, int w) {
    map[u][v] = w;
    map[v][u] = w; //floyed 也可以解決有向圖
}

void floyed(int nv) {
    int i, j, k;
    for (i=1; i<=nv; i++)
        for (j=1; j<=nv; j++)
            for (k=1; k<=nv; k++)
                map[i][j] = min(map[i][j], map[i][k]+map[k][j]);

}

/**
    注意:連接矩陣添邊都應該注意是否有重邊,floyed 算法既可以解決有向圖又可以解決
    無向圖,但是不能解決帶負權迴路的圖
*/

收藏於 2011-11-18
來自於百度空間

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