题目链接
解题方法:拓扑排序(DFS)
题目分析
题目大意
给定n个任务,有m组优先顺序,如1 2,表示完成任务2之前必须完成任务1。问:完成这n个任务的任意一个符合条件的排列顺序。
解析
这题一开始以为是判断能否完成任务,后来发现是要求输出顺序,存在优先级的顺序问题,所以采用拓扑排序,根据紫书上的模版敲的,后来发现给的模版就是用于这道题的。
吐槽:本来代码就是对的,然而交了五六发全是WA,后来代码发给队友,人家给我加了几个括号Ac了……Ac了……Ac了……凌乱。
拓扑排序(DFS版)个人理解
总共n个点(0~n-1),m组关系。
t:topo数组反向记录时的位置下标。
G数组:邻接矩阵 G[u][v]=1表示 u到v单向连通。
c数组:0表示未访问,1表示已找过,-1表示在DFS递归中。
topo数组:记录拓扑排序后的结果。
从第一个点开始找,对每一个点一直递归,递归的层数越深(即在图中越靠上),越先进入topo数组尾部。
各点的访问顺序:正向访问
————————>
1 2 3 4 5 6 7 8 … n
topo数组的填入顺序:反向填入
<————————
1 2 3 4 5 6 7 8 … n
toposort()函数返回该图是否出环
topo[]数组储存最终结果
代码
1 |
|