/**
不知道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
拓撲排序 topsort()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.