拓撲排序 topsort()

/**
    不知道topsort 排序有沒有專門的算法,不過今天貼這個挺簡單的,也好理解

    拓撲排序就是,給出一系列的需求關係,求一個序列,這個序列完全滿足這裏面
    的全部需求,直到結束

    如:你想要認識 奧巴馬 必須要認識 F 和 D, 你要認識 D 必須認識 B,
        可是你要認識B 又得靠 A 和 C,當然認識 F 也得通過C

    當然這些關係就是
        A->B
        C->B
        C->F
        B->D
        D->F
        F->奧巴馬
    所以你要認識奧巴馬可以 按照這個序列 A->C->B->D->F->奧巴馬
    這就是拓撲排序

    剛剛又做了下POJ 1094 終於過了,以前看別人代碼用到floyed 傳遞閉包,
    其實不用也可以的,考慮的情況太多,ACM 真是太傷腦筋

*/

int map[MAX][MAX];
char path[MAX];
//map中記錄各頂點的關係, 結點爲MAX, path 記錄拓撲排序結果

bool topsort() {
    int i, j, k, d[Max];
    for (i=0; i<n; i++)
        for (d[i]=j=0; j<n; j++)
            d[i] += map[j][i];       //計算第i 個結點入度

    for (k=0; k<n; k++) {
        for (i=0; i<n && d[i]; i++); //尋找入度爲零的結點

        if (i == n) return false;    //有環,沒找到返回不存在

        for (d[i]=-1, j=0; j<n; j++) //去掉i 結點,維護i 子結點
            d[j] -= map[i][j];

        path[k] = i;                 //記錄拓撲序列
    }
    return true;                     //如存在返回真
}

int main() {
    int n;
    /**
        設有n 個點並建好圖
        注意 :memset(map, 0, sizeof (map));
        添邊 (u, v) 即 map[u][v] = 1;
    */
    if (topsort()) {
        for (int i=0; i<n; i++)
            printf("%c ", path[i]);
    }
    else
        printf("不存在 ");

    return 0;
}

/**
    傷不起,傷不起,傷不起,睡覺,晚安
*/

收藏於 2012-01-11

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