Leetcode 743. 網絡延遲時間 Dijkstra算法

題目等價於找到從K點出發,所有最短路徑的最大值,這個時間段,所有點一定都能收到信號。所以是標準的Dijkstra算法

O(N^2)的Dijkstra思路如下:

維護一個dist數組用來存儲從K點到其他所有點的最短距離,還要維護一個visited數組記錄點是否已經作爲中間過程用過。

最外層循環是迭代次數,對於N個點,只需要迭代N-1次,因爲其實最後一個點不用再迭代了。

首先,先要找到dist數組中距離最近的一個點,這個點沒有作爲中間點使用過,然後去跟新其他dist數組的值

完成之後,記得到了dist數組,這裏有一個技巧是直接使用inf運算來避免一些邊界判斷,所以inf不能取得越界。下面是這個算法的最優代碼:

const int INF = 0x3f3f3f3f;
class Solution {
public:
    int networkDelayTime(vector<vector<int>>& times, int N, int K) {
        vector<vector<int>> matrix(N+1,vector<int>(N+1,INF));
        for(auto time:times){
            matrix[time[0]][time[1]] = time[2];
        }
        vector<bool> visited(N+1);
        vector<int> dist(N+1,INF);
        dist[K] = 0;
        for(int i=0;i<N-1;i++){
            int tmp = -1;
            for(int j=1;j<=N;j++){
                if(!visited[j]&&(tmp==-1||dist[j]<dist[tmp])){
                    tmp = j;
                }
            }
            for(int j=1;j<=N;j++){
                dist[j] = min(dist[j],dist[tmp]+matrix[tmp][j]);
            }
            visited[tmp] = true;
        }
        int ans = *max_element(dist.begin()+1, dist.end());
        return ans == INF ? -1: ans;
    }
};

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章