743. Network Delay Time
題目網址:https://leetcode.cn/problems/network-delay-time/
題意:有
n
個網路節點, 標記為1
到n
。給一 list
times
, 表示訊號經過有向邊的傳遞時間。times[i] = (ui, vi, wi)
, 其中ui
是起點、vi
是終點, 而wi
是一個訊號從起點傳遞到終點的時間。從某個節點
k
發出一個訊號, 返回需要多久才能使所有節點都收到訊號?如果不能使所有節點都收到訊號, 則返回-1
。
Solution:
想法:利用 Dijkstra 演算法(BFS + Heap), 而非單純 BFS, 因為
weight
有可能不為1
, 這樣會導致 BFS 所得出之答案未必為解答。步驟如下:
- 建立 adjacent lit
- 建立 min heap
- 執行 BFS
➔ BFS 中得到未拜訪過的點
cur
, 則dis
必為起點k
到cur
的最短路徑e.g. 下圖中, 求 1 到 2 的時間
- 若用 BFS 求解, 則 path 為 1 ➔ 2, 得出 4
- 正確的 path 應為 1 ➔ 3 ➔ 4 ➔ 2, 得出 3
typedef pair<int, int> pii; // {weight, next} |
- time:$O(E \cdot log(E))$ ➔ Dijkstra 的時間複雜度, 因為
pq
中最多有E
條邊, 每次 push / pop 元素需花 $O(log(E))$ - space:$O(V + E)$ ➔ 因為
adj
為 $O(V + E)$,V
是因為要記錄所有點,E
是因為會記錄所有邊
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論