题目:
有 n 个网络节点,标记为 1 到 n。
给你一个列表 times,表示信号经过 有向 边的传递时间。 times[i] = (ui, vi, wi),其中 ui 是源节点,vi 是目标节点, wi 是一个信号从源节点传递到目标节点的时间。
现在,从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1 。
算法:
方法一:单源最短路径算法 Dijkstra
func networkDelayTime(times [][]int, n int, k int) int {
// 放置INF + 数字时溢出
INF := math.MaxInt32 / 2
weight := make([][]int, n)
visited := make([]bool, n)
for i := range weight {
weight[i] = make([]int, n)
for j := range weight[i] {
weight[i][j] = INF
}
}
// 初始化图
for i := range times {
weight[times[i][0] - 1][times[i][1] - 1] = times[i][2]
}
// 初始化dist, dist保存从k-1到每个index的最短距离
dist := make([]int, n)
for i := range dist {
dist[i] = INF
}
dist[k - 1] = 0
// fmt.Println(dist)
for i := 0; i < n; i ++ {
node := -1
// 找到距离node最近的且未标记node
for j := 0; j < n; j ++ {
if !visited[j] && (node == -1 || dist[j] < dist[node]) {
node = j
}
}
visited[node] = true
// 更新node到所有未标记点的距离
for j := 0; j < n; j ++ {
dist[j] = min(dist[j], dist[node] + weight[node][j])
// fmt.Println(node + 1,"->",j + 1, dist[j])
}
}
ans := 0
for i := range dist {
if dist[i] == INF {
return - 1
}
ans = max(ans, dist[i])
}
return ans
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
func max(a, b int) int {
if a > b {
return a
}
return b
}