【算法】图 (4) 拓扑排序

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值