743 網路延遲時間
阿新 • • 發佈:2021-01-11
技術標籤:LeetCode
題目描述:
有 N 個網路節點,標記為 1 到 N。
給定一個列表 times,表示訊號經過有向邊的傳遞時間。 times[i] = (u, v, w),其中 u 是源節點,v 是目標節點, w 是一個訊號從源節點傳遞到目標節點的時間。
現在,我們從某個節點 K 發出一個訊號。需要多久才能使所有節點都收到訊號?如果不能使所有節點收到訊號,返回 -1。
示例:
輸入:times = [[2,1,1],[2,3,1],[3,4,1]], N = 4, K = 2
輸出:2
注意:
N 的範圍在 [1, 100] 之間。
K 的範圍在 [1, N] 之間。
times 的長度在 [1, 6000] 之間。
方法1:
主要思路:解題彙總連結
(1)先建立有向圖,結點之間的傳遞時間相等於距離或權重,計算從某個結點出發,是否能夠到達所有的結點,若能,則最全的結點的最近距離是多少;
(2)使用廣度優先搜尋,並使用陣列distance儲存從起始點到當前點的最近距離,廣度優先搜尋的過程中,若到達當前某個結點的距離小於當前距離,則進一步跟新該點的距離,並重新將該點壓入到佇列中;
(3)則distance陣列元素初始值為INT_MAX;
(4)廣度優先搜尋結束後,判斷distance陣列中是否還存在INT_MAX的元素,若存在,則說明從起點不能到達該點,故可以直接返回-1,否則,找出distance中的最大值,即為結果;
class Solution {
public:
int networkDelayTime(vector<vector<int>>& times, int N, int K) {
vector<vector<pair<int,int>>> graph(N+1);
for(vector<int>&t:times){//建立帶權重的有向圖
graph[t[0]].push_back({t[1],t[2]});
}
//儲存從起始點到各個結點的最短距離
vector<int> distance(N+1,INT_MAX);
queue<int> q;
q.push(K);//初始化佇列,既起始點
distance[K]=0;
//廣度優先搜尋
while(!q.empty()){
int cur_node=q.front();
q.pop();
for(auto&it:graph[cur_node]){//遍歷各個鄰接點
if(distance[cur_node]+it.second<distance[it.first]){//說明存在更小的距離,更新距離
q.push(it.first);
distance[it.first]=distance[cur_node]+it.second;
}
}
}
int res=0;//找出能到達的結點的最長距離
//遍歷各個結點
for(int i=1;i<=N;++i){
if(distance[i]==INT_MAX){//說明當前結點不能到達
return -1;
}
res=max(res,distance[i]);
}
return res;
}
};