📌算法Go语言描述📌algorithm📌topological-order.go
package algorithm
/*
拓扑排序(Topological-Order)是一个有向无环图(Directed-Acyclic-Graph)的所有顶点的线性序列。
入度:指向该顶点的边的数量。出度:该顶点指向的其他点边的数量。
拓扑排序最经典的算法是Kahn算法,也叫入度表算法:
1. 按照一定的顺序进行构造有向图,记录后个节点的入度;
2. 从图中选择一个入度为0的顶点,输出该顶点;
3. 从图中删除该顶点及所有与该顶点相连的边
4. 重复上述两步,直至所有顶点输出。
5. 或者当前图中不存在入度为0的顶点为止。此时可说明图中有环。
6. 因此,也可以通过拓扑排序来判断一个图是否有环。
时间复杂度O(m+n),空间复杂度O(n),m为边数,n为顶点数。
*/
func TopologicalOrder(n int, edges [][2]int) []int { // 限定顶点为[0,n-1]
deg := make([]int, n) //入度表,顶点非紧凑时改用map
adjacency := make([][]int, n) //邻接表,顶点非紧凑时改用map
for _, e := range edges { //e[0]和e[1]分别代表from和to
adjacency[e[0]] = append(adjacency[e[0]], e[1])
deg[e[1]]++
}
queue := make([]int, 0, n) //辅助队列,需要最小字典顺序时改用优先队列
for i, d := range deg {
if d == 0 {
queue = append(queue, i)
}
}
res := make([]int, 0, n)
for len(queue) > 0 {
pos := queue[0]
queue = queue[1:]
res = append(res, pos)
for _, v := range adjacency[pos] {
deg[v]--
if deg[v] == 0 {
queue = append(queue, v)
}
}
}
if len(res) == n {
return res
}
return nil
}