首頁>技術>

福大大 答案2021-04-24:

1)在圖中找到所有入度為0的點輸出。

2)把所有入度為0的點在圖中刪掉,繼續找入度為0的點輸出,週而復始。

要求:有向圖且其中沒有環。

應用:事件安排、編譯順序。

程式碼用golang編寫。程式碼如下:

package mainimport "fmt"func main() {    matrix := [][]int{        {0, 1, 1, 0, 0, 0},        {0, 0, 1, 0, 0, 1},        {0, 0, 0, 1, 0, 0},        {0, 0, 0, 0, 0, 0},        {0, 1, 0, 1, 0, 0},        {0, 0, 0, 1, 0, 0}}    graph := NewGraph(matrix)    ret := sortedTopology(graph)    for i := 0; i < len(ret); i++ {        fmt.Print(ret[i].Val, "\t")    }}// directed graph and no loopfunc sortedTopology(graph *Graph) []*Node {    // key 某個節點   value 剩餘的入度    inMap := make(map[*Node]int)    // 只有剩餘入度為0的點,才進入這個佇列    zeroInQueue := make([]*Node, 0)    for _, node := range graph.Nodes {        inMap[node] = node.In        if node.In == 0 {            zeroInQueue = append(zeroInQueue, node)        }    }    result := make([]*Node, 0)    for len(zeroInQueue) > 0 {        cur := zeroInQueue[len(zeroInQueue)-1]        zeroInQueue = zeroInQueue[0 : len(zeroInQueue)-1]        result = append(result, cur)        for _, next := range cur.Nexts {            inMap[next] = inMap[next] - 1            if inMap[next] == 0 {                zeroInQueue = append(zeroInQueue, next)            }        }    }    return result}type Edge struct {    Weight int    From   *Node    To     *Node}// 點結構的描述type Node struct {    Val   int    In    int    Out   int    Nexts []*Node    Edges []*Edge}type Graph struct {    Nodes map[int]*Node    Edges map[*Edge]struct{}}//二維陣列轉成邊func NewGraph(matrix [][]int) *Graph {    graph := &Graph{}    graph.Nodes = make(map[int]*Node)    graph.Edges = make(map[*Edge]struct{})    for i := 0; i < len(matrix); i++ {        for j := 0; j < len(matrix[0]); j++ {            // 拿到每一條邊, matrix[i]            weight := matrix[i][j]            if weight > 0 {                from := i                to := j                if _, ok := graph.Nodes[from]; !ok {                    graph.Nodes[from] = &Node{Val: from}                }                if _, ok := graph.Nodes[to]; !ok {                    graph.Nodes[to] = &Node{Val: to}                }                fromNode := graph.Nodes[from]                toNode := graph.Nodes[to]                newEdge := &Edge{Weight: weight, From: fromNode, To: toNode}                fromNode.Nexts = append(fromNode.Nexts, toNode)                fromNode.Out++                toNode.In++                fromNode.Edges = append(fromNode.Edges, newEdge)                graph.Edges[newEdge] = struct{}{}            }        }    }    return graph}

執行結果如下:

***

[左神java程式碼](https://github.com/algorithmzuo/algorithmbasic2020/blob/master/src/class16/Code03_TopologySort.java)

15
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 淺談JVM調優中的兩個小知識點