D 4
0 2
0 1
1 2
3 2
拓扑序列:(一定是在有向图中)
3,0,1,2
0,3,1,2
0,1,3,2
D 4(只有4个点,没有边)有多少种拓扑序列?
答:n!=n*(n-1)*(n-2)…*2*1(因为每个点的入度都为0)
1 根据入度的定义求拓扑序列
入度:有向图中某点 作为图中 边的终点 的次数之和。
每次挑选一个入度为0的点,然后记录该点,删除该点以及其相邻的边,更新其他点的入度;继续挑选,记录删除;如此以往得到的序列就为拓扑序列。
to be continued
2 根据DFS求拓扑序列
输入样例:
D 7
0 3
4 0
5 3
3 2
4 5
- 第*行:随意挑选一个起点,假设从0开始;初始化
- 第0行:对0进行DFS搜索,[0->3->2]标记为Discovered,搜到底,也就是[2],得知没有点与[2]相邻,所以入栈,标记为Processed,得到[2];回退到[3],发现没有点与[3]相邻,入栈,标记为Processed,得到[2, 3];回退到[0],发现没有点与[0]相邻,入栈,标记为Processed,得到[2,3,0];
- 第1行:对1进行DFS搜索,[1]标记为Discovered,发现没有点与[1]相邻,入栈,标记为Processed,得到[2,3,0,1];
- 第2行:2已访问过,跳过
- 第3行:3已访问过,跳过
- 第4行:对4进行DFS搜索,[4->5]标记为Discovered,搜到底,也就是[5],得知与[5]相邻的点都访问过了,所以入栈,标记为Processed,得到[2,3,0,1,5];回退到[4],得知与[4]相邻的点都访问过了,所以入栈,标记为Processed,得到[2,3,0,1,5,4];
- 第5行:5已访问过,跳过
- 第6行:对6进行DFS搜索,[6]标记为Discovered,发现没有点与[6]相邻,入栈,标记为Processed,得到[[2,3,0,1,5,4,6];
这里的主要难点是每一次的DFS搜索都包含Undiscovered->Discovered->Processed的变化,但是这些并没有体现在调用的步骤上,只能通过语言描述。
3 代码
tbc