拓扑排序

拓扑排序是一个常用的算法片段,但是在周赛中有时候不是很容易写出来。在这里记录下

func topSort(k int, edges [][]int) []int {
    g := make([][]int, k)
    ind := make([]int, k)
    for _, e := range edges {
        x, y := e[0]-1, e[1]-1
        g[x] = append(g[x], y)
        ind[y]++
    }
    q := make([]int, 0, k)
    orders := q
    for i, d := range ind {
        if d == 0 {
            q = append(q, i)
        }
    }
    for len(q) > 0 {
        x := q[0]
        q = q[1:]
        for _, y := range g[x] {
            if ind[y]--; ind[y] == 0 {
                q = append(q, y)
            }
        }
    }
    if len(q) > 0 {
        // 图中有环
        return nil
    }
    return orders[:k]
}

你可能感兴趣的:(拓扑排序)