前言
练习5.11: 现在线性代数的老师把微积分设为了前置课程。完善topSort,使其能检测有向图中的环。
没找到5.11的参考Go语言版,参考C语言版本的思路,结合原有的代码逻辑,在最小改动的原则上实现了Go语言版本的深度优先遍历拓扑排序环检测。
5.10、5.12 可参考 https://blog.csdn.net/taoshihan/article/details/101249100
参考的C语言版本 https://blog.csdn.net/qq_40507857/article/details/84305444
实现逻辑
用三种状态来标记访问的节点:未访问、正在访问、已访问;
初始情况,均为未访问;
未访问项访问时设置为正在访问,递归访问该项的前序课程,访问结束后设置为已访问;
若正在访问时遇到一个正在访问的课程,说明存在环,标记,退出。
代码
package main
import (
"fmt"
"sort"
)
func topoSort(m map[string][]string) map[int]string {
var order = make(map[int]string)
index := 0
seen := make(map[string]int) // 初始值默认为0, 与下面notvisit状态相对应
const (
notvisit = <