题目描述:具体描述见原题,简单来说就是判断有向加权图内给定节点到任何节点是否连通,如果不连通,返回-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
}
补充说明:无。