/**
不知道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()
最新推荐文章于 2024-08-04 17:28:44 发布