743.网络延迟时间

114 阅读1分钟

题目:
有 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
}