題目等價於找到從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;
}
};