Skip to content
← 返回算法列表
问题与数据结构

拓扑排序 ​

图

说明 ​

反复取入度为零的节点;仅有向无环图能输出全部节点。

分析 ​

先统计每个节点的入度,把所有入度为零的节点放入队列。移除节点时减少其后继的入度,新变成零的节点即可入队。

图解推演

图 0→1、0→2、1→2 的入度为 [0,1,2]。移除 0 后变成 [0,0,1],此时只能加入 1;再移除 1 才能加入 2。入度为零表示所有前置依赖都已完成;多个零入度点可有多种合法顺序,不应把输出唯一性当成正确性要求。

查看图表代码

适用前提与边界 ​

若结果数量小于顶点数,剩余节点属于有向环或依赖于环,无法给出完整顺序。

示例输入与调用 ​

go
fmt.Println(TopologicalSort([][]int{{1, 2}, {2}, {}}))

运行输出 ​

text
[0 1 2]

完整 Go 示例 ​

go
package main

import "fmt"

func TopologicalSort(g [][]int) []int {
	indeg := make([]int, len(g))
	for _, edges := range g {
		for _, v := range edges {
			indeg[v]++
		}
	}
	q := []int{}
	for v, d := range indeg {
		if d == 0 {
			q = append(q, v)
		}
	}
	out := []int{}
	for h := 0; h < len(q); h++ {
		v := q[h]
		out = append(out, v)
		for _, w := range g[v] {
			indeg[w]--
			if indeg[w] == 0 {
				q = append(q, w)
			}
		}
	}
	return out
}

func main() {
	fmt.Println(TopologicalSort([][]int{{1, 2}, {2}, {}}))
}

继续阅读