拓扑排序动画演示

反复摘掉入度为 0 的节点,剩不下就是有成环。

键盘:← → 单步 ·空格 播放/暂停 · R 重置 ·Home/End 到两端

拓扑排序把「谁必须先来」的依赖图捋成一条线性序列:每次摘掉一个不再欠任何前置的节点,剩下的图随之再松一格。这一页用「穿戴出门」的依赖样本逐边演示,节点下方实时标注入度;另一种解法走 DFS 路线:把「孩子全部结算才轮到自己」的后序记下来,最后一步整行反转就是合法拓扑序。

两条路的差异在带环样本上看得最清:Kahn 跑到队列空却还剩几个点没摘掉——入度永远降不到零,就是环上互相制约的直接证据;DFS 则在撞上「还在递归栈上的灰点」时逮到回边。两者殊途同归地宣布:有环就没有拓扑序。课程表排不开、构建循环依赖报错、Excel 公式循环引用弹窗,底下都是同一件事。页面末步会点名列出被卡住的节点,让「有环」变成看得见的证据而不是口号。

拓扑排序演示怎么用

  • 换解法:两档按钮切 Kahn 与 DFS 逆后序,两种思路在同一张 DAG 上各跑各的,产出序列可以互相校验合法性。
  • 换样本:另一档选图:DAG 样本按依赖方向从左往右分层;带环样本里 B、D、E 互相咬住,专门用来演示失败现场。
  • 盯入度:Kahn 档每个节点下方实时显示入度,删边的瞬间入度跳数同步刷新,归零即入队。
  • 读三色:DFS 档里 sub 改报白灰黑状态,指向灰点的边就是回边,出现即宣告有环。

常见问题

拓扑序为什么要反转后序,直接用后序不行吗?

后序里「父亲排在所有孩子之后」,而拓扑序要求父亲(依赖的前置)排在前面,方向恰好相反,倒带来刚好抵消。直觉是:被依赖越深的点越先完成后序记账,把它排到序列最前自然合法。

拓扑排序的结果唯一吗?

一般不唯一:同一时刻有多个零入度点时,谁先排队就产生谁在前。页面会给出一个确定序列(按节点表顺序排队),检验标准只有一条:每条边的起点都排在终点前面。

有环时两种解法报的「环」是一回事吗?

同一枚硬币的两面:DFS 的回边直接给出环的轮廓;Kahn 的剩余点集合是被环圈住的部分(可能含不止一个环)。前者适合定位环在哪儿,后者实现直白、顺手还能判「能否全部排完」。

演示编号 C07无需安装,手机端同样可用按 Ctrl + K 搜工具与演示

顺手能用上的工具