深度优先搜索
Posted 浮云神码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度优先搜索相关的知识,希望对你有一定的参考价值。
import java.util.Stack;
/**
* https://leetcode-cn.com/problems/network-delay-time
* 743. 网络延迟时间
* 难度 中等
* 有 n 个网络节点,标记为1到 n。
*
* 给你一个列表times,表示信号经过 有向 边的传递时间。times[i] = (ui, vi, wi),
* 其中ui是源节点,vi是目标节点, wi是一个信号从源节点传递到目标节点的时间。
*
* 现在,从某个节点K发出一个信号。需要多久才能使所有节点都收到信号?
* 如果不能使所有节点收到信号,返回-1 。
*
* 示例 1:
*
* 输入:times = [[2,1,1],[2,3,1],[3,4,1]], n = 4, k = 2
* 输出:2
* 示例 2:
*
* 输入:times = [[1,2,1]], n = 2, k = 1
* 输出:1
* 示例 3:
*
* 输入:times = [[1,2,1]], n = 2, k = 2
* 输出:-1
*
* 提示:
*
* 1 <= k <= n <= 100
* 1 <= times.length <= 6000
* times[i].length == 3
* 1 <= ui, vi <= n
* ui != vi
* 0 <= wi <= 100
* 所有 (ui, vi) 对都 互不相同(即,不含重复边)
*
* 来源:力扣(LeetCode)
* 链接:https://leetcode-cn.com/problems/network-delay-time
*/
public class NetworkDelayTime {
public int networkDelayTime(int[][] times, int n, int k) {
// 初始化邻接矩阵
int[][] matrix = new int[n + 1][n + 1];
// 因为传递时间有可能为0, 所以将数据初始化为-1
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
matrix[i][j] = -1;
}
}
// 根据times初始化邻接矩阵, 相应位置上的值设置为信号传递时间
for (int[] time : times) {
int ui = time[0], vi = time[1], wi = time[2];
matrix[ui][vi] = wi;
}
// 每个节点的延迟时间
int[] delayTimes = new int[n + 1];
for (int i = 1; i <= n; i++) {
delayTimes[i] = Integer.MAX_VALUE;
}
// 借助栈来实现深度优先搜索
Stack<Integer> stack = new Stack<>();
stack.push(k);
delayTimes[k] = 0;
while (!stack.isEmpty()) {
int current = stack.pop();
for (int i = 1; i <= n; i++) {
if (matrix[current][i] >= 0) {
// 比较从current节点到i节点的传播时间和已存储的传播时间, 取最小值
int iDelayTime = delayTimes[current] + matrix[current][i];
if (iDelayTime < delayTimes[i]) {
// 一旦出现更小的传播时间, i后的节点传播时间都需要重新计算
delayTimes[i] = iDelayTime;
stack.push(i);
}
}
}
}
// 返回某个节点最大的传播时间
int max = Integer.MIN_VALUE;
for (int i = 1; i <= n; i++) {
max = Math.max(max, delayTimes[i]);
}
return max == Integer.MAX_VALUE ? -1 : max;
}
}
以上是关于深度优先搜索的主要内容,如果未能解决你的问题,请参考以下文章