# 743. Network Delay Time ## 想法 Dijkstra's algorithm模板題 ## 演算法 ``` /* 1. 建構圖 2. 使用Dijkstra's algorithm找出從k出發的最短路徑,放在陣列d中 3. 找到d中的最大值maxV,若maxV為MAXIMUM,則回傳-1,否則回傳maxV */ /* Dijkstra's algorithm 1. 初始化d陣列,pq, done陣列 2. 將d[s]設為0,並推入pq 3. while !pq.empty(): 3.1. u = pq.top; pq.pop(); 3.2. 若u已經做完了,continue,否則,done[u]=1 3.3. for every v = adj[u]: 3.3.1. 若v還沒做完,且從s走到u再走到v會比s走到v還要短,則更新d[v],並將d[v]推入pq中 */ ``` ## 程式碼 ```cpp= #define ll long long class Solution { public: vector <ll> dijkstra(vector <vector <pair <ll, ll>>> &adj, ll n, ll s) { vector <ll> d(n + 1, LONG_LONG_MAX); priority_queue <pair <ll, ll>, vector <pair <ll, ll>>, greater <pair <ll, ll>>> pq; vector <ll> done(n + 1); d[s] = 0; pq.push({0, s}); while (!pq.empty()) { pair <ll, ll> tmp = pq.top(); ll u = tmp.second; pq.pop(); if (done[u]) continue; done[u] = 1; for (auto it = adj[u].begin(); it != adj[u].end(); it++) { ll v = it -> first, w = it -> second; if (!done[v]) { if (d[v] > d[u] + w) { d[v] = d[u] + w; pq.push({d[v], v}); } } } } return d; } int networkDelayTime(vector<vector<int>>& times, int n, int k) { vector <vector <pair <ll, ll>>> adj(n + 1, vector <pair <ll, ll>>()); for (int i = 0; i < times.size(); i++) { ll u = times[i][0], v = times[i][1], w = times[i][2]; adj[u].push_back({v, w}); } vector <ll> d = dijkstra(adj, n, k); ll maxV = LONG_LONG_MIN; for (int i = 1; i <= n; i++) { maxV = max(maxV, d[i]); } if (maxV == LONG_LONG_MAX) { return -1; } else { return maxV; } } }; ```