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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 字符串入门
- 下一篇: A Style-Aware Conten