解題心得
Dijkstra 演算法實作。
1. emplace_back 會把該筆資料放到最末端;emplace 是放入任意位置。
2. 用 minHeap,是因為在演算法中,要取出當下 cost 最小的路徑來做更新。
3. 用 max(),是因為找出傳到所有 node 最少需要的時間,又最遠 node 要得最久。
4. 如果無法每個 node 都拜訪,則回傳 -1。
程式碼
typedef pair<int, int> edge; // target node, weight; class Solution { public: int networkDelayTime(vector<vector<int>>& times, int n, int k) { vector<vector<edge>> graph(n+1); for(int i=0; i<times.size(); i++) graph[times[i][0]].emplace_back(times[i][1], times[i][2]); priority_queue<edge, vector<edge>, greater<edge>> minHeap; vector<bool> isVisited(n+1, false); minHeap.emplace(0, k); int ans = 0; while(!minHeap.empty()) { int w1, n1; w1 = minHeap.top().first, n1 = minHeap.top().second; minHeap.pop(); if(isVisited[n1]) continue; isVisited[n1] = true; ans = max(ans, w1); for(int i=0; i<graph[n1].size(); i++) { int w2 = graph[n1][i].second, n2 = graph[n1][i].first; if(!isVisited[n2]) minHeap.emplace(w1 + w2, n2); } } for(int i=1; i<=n; i++) { if(!isVisited[i]) return -1; } return ans; } };
沒有留言:
張貼留言