美文网首页
743. 网络延迟时间【深度优先搜索DFS】【超时】

743. 网络延迟时间【深度优先搜索DFS】【超时】

作者: 月下蓑衣江湖夜雨 | 来源:发表于2020-08-10 16:27 被阅读0次

题目

题目

思路

DFS;
记录DFS到每个节点的时间arriveTime = make([]int, N+1, N+1);
递归停止条件:如果arriveTime[x]不等于初始值-1,说明已经到达过改节点了,那是否要继续进行DFS呢?
需要看此次的到达时间是否比之前的到达时间小;

代码(超时了)

// DFS
// 用一个数组cost[N+1](N的范围是1~N)记录,当DFS到这个节点的时候,花了多长时间
// cont[N+1]初始值为-1
//
// times [][]int生成一个连接map
// 遍历到某个节点时,根据这个连接map,进行下一次的dfs
var linkMap map[int][][2]int
var arriveTime []int

func networkDelayTime(times [][]int, N int, K int) int {
    // 节点连接map
    linkMap = make(map[int][][2]int)
    for k := range times {
        if linkMap[times[k][0]] == nil {
            linkMap[times[k][0]] = make([][2]int, 0, 0)
        }
        linkMap[times[k][0]] = append(linkMap[times[k][0]], [2]int{times[k][1], times[k][2]})
    }

    //fmt.Printf("linkMap is %v\n", linkMap)

    // 记录到达时间
    arriveTime = make([]int, N+1, N+1)
    for k := range arriveTime {
        arriveTime[k] = -1
    }

    //fmt.Printf("linkMap is %v\n\n", linkMap)
    dfs(K, 0)
    //fmt.Printf("arriveTime is %v\n\n", arriveTime)

    max := arriveTime[1]
    for i:=1; i<=N; i++ {
        if arriveTime[i] == -1 {
            return -1
        }
        if arriveTime[i] > max {
            max = arriveTime[i]
        }
    }

    return max
}

func dfs(k int, reachTime int) {
    // fmt.Printf("dfs(%v)\n", k)
    // 递归停止条件: 访问过 && 此次的到达时间 > 大于之前的到达时间
    // 网状结构,不是树状结构,可能有多个可达路径
    // networkDelayTime([][]int{{1,2,1},{2,3,2},{1,3,2}}, 3, 1)
    if arriveTime[k] != -1 && reachTime > arriveTime[k] {
        return
    }

    arriveTime[k] = reachTime // 标志该节点已经被访问

    for _, node := range linkMap[k] {
        //fmt.Printf("node is %v\n", node)
        dfs(node[0], reachTime+ node[1])
    }
}

相关文章

网友评论

      本文标题:743. 网络延迟时间【深度优先搜索DFS】【超时】

      本文链接:https://www.haomeiwen.com/subject/jkejdktx.html