leetcode-743

239 阅读1分钟

题目描述:具体描述见原题,简单来说就是判断有向加权图内给定节点到任何节点是否连通,如果不连通,返回-1。如果连通,返回到所有权重值中最大值。

解题思路:BFS+DP。用一维数组记录从出发点到各个节点最小权重,二维数组记录从i点到j点权重值。起始点记为k,更新策略为dp[i] = min(dp[i],cost[k][i]+dp[k])。从给定节点开始,广度遍历过程中动态更新。具体过程见代码。

具体代码:

func networkDelayTime(times [][]int, n int, k int) int {
   res, maxDes := 0, int(1e4)
   minDes := make([]int, n+1)
   for i := 1; i <= n; i++ { // 初始化开始点到各个节点权重数组
      minDes[i] = maxDes
   }
   minDes[k] = 0
   cost := make([][]int, n+1) // 记录点(i,j)之间权重值
   for i := 1; i <= n; i++ {
      cost[i] = make([]int, n+1)
      for j := 1; j <= n; j++ {
         cost[i][j] = maxDes
      }
   }
   for _, t := range times{
      cost[t[0]][t[1]] = t[2] // 根据times更新(i,j)之间权重值,如果(i,j)间不为初始值,则代表(i,j)之间连通
   }
   queue := make([]int, 0)
   queue = append(queue, k)
   for len(queue) != 0 {
      temp := queue[0]
      for i := 1; i <= n; i++ { // 动态更新权重数组
         if minDes[i] > minDes[temp] + cost[temp][i] {
            minDes[i] = minDes[temp]+cost[temp][i]
            queue = append(queue, i)
         }
      }
      queue = queue[1:]
   }
   for i := 1; i <= n; i++ { // 循环权重值数组,找到最大权重值
      res = max(res, minDes[i])
      if res == maxDes { // 如果权重值为预定上限,则代表存在不可达节点
         return -1
      }
   }
   return res
}

补充说明:无。