package Graph
import (
"Algorithm/Container"
"fmt"
"testing"
)
/*
图的拓扑排序
1.在图中找到所有入度为0的点输出
2.把所有入度为0的点在图中删除,继续找入度为0的点输出,周而复始
3.图的所有点都被删除后,一次输出的顺序就是拓扑排序
删除后消除之前边对他的影响
要求:有向图且没有环
应用:时间安排,编译顺序(处理包之间的引用,不能循环依赖)
*/
//无环点图
func sortedTopology(graph *Graph) []*Node {
//key:某一个node , value:剩余的入度
inMap := make(map[*Node]int)
zeroInQueue := Container.NewQueue() //剩余入度为0的节点入该队列
for k, v := range graph.Nodes {
node := graph.Nodes[k]
inMap[node] = v.In
if v.In == 0 {
// fmt.Println(v.In)
zeroInQueue.Push(node)
}
}
//for k,v:=range inMap{
// fmt.Println(k,v)
//}
fmt.Println(inMap)
//拓扑排序的结果,一次加入result
result := make([]*Node, 0)
//
for !zeroInQueue.Empty() {
node, _ := zeroInQueue.Pop()
cur := node.(*Node)
result = append(result, cur)
for k := range cur.Nexts {
inMap[cur.Nexts[k]]-- //=inMap[cur.Nexts[k]]-1 入度-1 消除入度
if inMap[cur.Nexts[k]] == 0 {
zeroInQueue.Push(cur.Nexts[k])
}
}
}
return result
}
func TestGraphSort(t *testing.T) {
matrix := [][]int{
{1, 2, 3},
{2, 2, 5},
{2, 5, 9},
{6, 3, 7},
{3, 5, 7},
{6, 5, 8},
}
g := CreateGraph(matrix)
for _, v := range sortedTopology(g) {
fmt.Println(v.Value)
}
}
图——拓扑排序
于 2021-10-28 15:09:32 首次发布