Breadth-first Search(广度优先搜索)专题2

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/flying_all/article/details/84949479

743. Network Delay Time

输入:int[][] times times[i]= new int[]{v,u,w} 表示从节点v到节点u需要时间w。注意这里是有向图。
   int N 节点总数。
   int k 起始节点

输出:从节点k到其他各个节点的最短路径和。如果有一个节点不能达到则返回-1。

分析:从题目描述直观地看到求一个节点到其他各个节点的最短路径和。适用于迪杰斯特拉算法(Dijkstra’s Algorithm )。
DijStra’s Algorithm描述
  迪杰斯特拉算法是属于图论中的一个算法。
  定义一个int[] dist 存储各个节点到k节点的最小路径长度。数组初始化为Integer.MAX_VALUE。定义一个Set seen,保存已经处理过的节点。定义一个最小堆minHeap,堆顶存放的是当前情况下距离k点最近的点。初始化放入K,0。
  计算过程:
  1 在minHeap不为空的情况下,取得堆顶元素[v,dis]。
  2 如果v已经在seen中出现,则已经处理过,跳转到1。
  3 如果v不在seen中,先设置dist[v]=dis,将节点v加入到seen。其次检查v可以达到的节点列表list。对每个节点u判断dist[u] 与dist[v]+times[v][u][2]的大小关系。大于,则v节点可能是到达u节点的一条最短路径,将[u,dist[v]+times[v][u][2]]入minHeap。否则不做处理。跳转到1。
  4 直到所有节点都处理完成。
  这个过程对于节点v,做处理;接着将未处理过的邻接点u放入队列中等待处理。典型的BFS思路。
  当我把代码写完用测试用例测试。[[2,1,1],[2,3,1],[3,4,1]],4,2。发现标准答案是2,而我出的结果是4。我在想:节点2到节点1耗时1;节点2到节点3耗时1;节点3到节点4耗时1,所以节点2到节点4耗时2。1+1+2=4没有问题呀。想想,解释只可能是从节点2发出的节点可以同时达到节点1和节点3,所以耗时1。节点3到节点4耗时1。所以总耗时1+1=2。节点1,节点3是节点2的临节点,可以同时发送。应该是这样解释吧。处理的技巧就是从dist数组中找最大值,当然最大值不能是Integer.MAX_VALUE。
代码
感悟:Dijstra’s 算法可以用两个for循环实现,也可以借助最小堆。代码实现的一些细节也影响执行时间。

111 Minimum Depth of Binary Tree

输入:二叉树
输出:二叉树的最小深度,也就是根节点到叶子结点的最短路径。
分析:在这里插入图片描述
 对于node3来说,如果左右子树都为null,那直接得到答案1。如果左右子树都不为null,那就是取左子树最小深度和右子树最小深度的最小值+1。如果左右子树一个为null(我一开始忘记分析了),那么就是不为null的子树的最小深度+1。
 用DFS递归实现最直白。

分析2:在这里插入图片描述
 我们也可以把树看做3层,哪层最先有叶子节点,那最小深度就在这里了。上图中在第2层就有叶子节点,所以最小深度是2。
 虽然是easy题目,但是思路明显比以前好多了,知道为什么对。
代码

猜你喜欢

转载自blog.csdn.net/flying_all/article/details/84949479