leetcode 743. 网络延迟时间

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kirito0104/article/details/82586824

有 N 个网络节点,标记为 1 到 N

给定一个列表 times,表示信号经过有向边的传递时间。 times[i] = (u, v, w),其中 u 是源节点,v 是目标节点, w 是一个信号从源节点传递到目标节点的时间。

现在,我们向当前的节点 K 发送了一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1

注意:

  1. N 的范围在 [1, 100] 之间。
  2. K 的范围在 [1, N] 之间。
  3. times 的长度在 [1, 6000] 之间。
  4. 所有的边 times[i] = (u, v, w) 都有 1 <= u, v <= N 且 1 <= w <= 100

思路

1、用Dijkstra做

code 

class Solution {
public:
    int networkDelayTime(vector<vector<int>>& times, int N, int K) {
        vector<int> dist(N+1,INT_MAX);   //距离数组
        vector<vector<int>> edges(101,vector<int>(101,-1));  //图的保存
        dist[K]=0;  //从k开始,初始化k
        int res=INT_MIN;
        queue<int> q{{K}};
        for(auto edge:times)
            edges[edge[0]][edge[1]]=edge[2];
        
        while(!q.empty()){
            unordered_set<int> visited;
            for (int i = q.size(); i > 0; --i)  //可能q为空,但还有节点未被扫到,所以加循环                                       
            {
                int u = q.front(); q.pop();
                for (int v = 1; v <= 100; ++v)   //i节点与每个v节点的关系
                    if (edges[u][v] != -1 && dist[u] + edges[u][v] < dist[v])
                    {
                        if (!visited.count(v)) {
                            visited.insert(v);
                            q.push(v);
                        }
                        dist[v] = dist[u] + edges[u][v];
                    }
            }

        }
        for (int i = 1; i <= N; ++i)
            res = max(res, dist[i]);
        return res==INT_MAX?-1:res;
    }
};

猜你喜欢

转载自blog.csdn.net/kirito0104/article/details/82586824