日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/10 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Breadth-first Search(广度优先搜索)专题2 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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題目,但是思路明顯比以前好多了,知道為什么對。
代碼

總結

以上是生活随笔為你收集整理的Breadth-first Search(广度优先搜索)专题2的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。