1,先了解什么是偏序?
偏序就是图中存在无先后顺序的顶点对。全序即找不到这样的顶点对。
2,什么是拓扑排序?
把图由偏序变成全序的操作即是拓扑排序。前提是有向无环图,拓扑才能成功。
3,Kahn算法思想:先把入度为0的点入栈,每次从中出栈一个顶点,删除从它出发的边,相应顶点的入度减少1,若有入度为0的点,则入栈,重复至栈为空。
4,DFS思想:前提是有向无环图,因为最先完成DFS的顶点恰好拓扑排序中最后一个完成的,最后完成DFS正好是拓扑排序中入度为0的顶点。
下边是代码:
test2.txt中内容为:
12 16
0 1
0 2
1 2
0 3
2 4
3 4
10 5
4 6
2 6
2 7
5 7
8 9
8 10
8 11
9 11
0 11
用Kahn算法求出来的结果为:
用DFS算法求出来的结果为:
两个结果是一样的。
Kahn的时间复杂度为O(n+e);
DFS的时间复杂度为O(n+e),空间复杂度都为O(n);
应用背景:在有关工程进度/次序的规划问题中,拓扑排序有着大量应用。
少了个释放空间的操作:
若数据集为下边这种格式:第一行为顶点数,边数;其他行的意思分别为:弧尾,出度,弧头结点列
10 12
0 2 1 2
1 2 3 4
2 2 3 5
3 1 7
4 1 8
5 1 6
6 1 8
7 2 8 9
8 0
9 0
则建立邻接表的代码为: