深度优先搜索

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; }}

以上是关于深度优先搜索的主要内容,如果未能解决你的问题,请参考以下文章

深度优先搜索算法解释下?

深度优先搜索

搜索算法---深度优先搜索

图相关算法

深度优先搜索学习---(入门)

深度优先搜索