1. 程式人生 > 其它 >743 網路延遲時間

743 網路延遲時間

技術標籤: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] 之間。

所有的邊 times[i] = (u, v, w) 都有 1 <= u, v <= N 且 0 <= w <= 100。

方法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; } };