zoukankan      html  css  js  c++  java
  • 743. Network Delay Time

    There are N network nodes, labelled 1 to N.

    Given times, a list of travel times as directed edges times[i] = (u, v, w), where u is the source node, v is the target node, and w is the time it takes for a signal to travel from source to target.

    Now, we send a signal from a certain node K. How long will it take for all nodes to receive the signal? If it is impossible, return -1.

    Note:

    1. N will be in the range [1, 100].
    2. K will be in the range [1, N].
    3. The length of times will be in the range [1, 6000].
    4. All edges times[i] = (u, v, w) will have 1 <= u, v <= N and 1 <= w <= 100.

    Approach #1: C++.[Bellman-Ford]

    class Solution {
    public:
        int networkDelayTime(vector<vector<int>>& times, int N, int K) {
            const int MAX_TIME = 101 * 100;
            vector<int> dist(N, MAX_TIME);
            dist[K-1] = 0;
            for (int i = 0; i < N; ++i) {
                for (auto time : times) {
                    int u = time[0]-1, v = time[1] - 1, w = time[2];
                    dist[v] = min(dist[v], dist[u] + w);
                }
            }
            int temp = *max_element(dist.begin(), dist.end());
            return temp == MAX_TIME ? -1 : temp;
        }
    };
    

      

    Approach #2: C++. [Floyd-Warshall]

    // Author: Huahua
    // Runtime: 89 ms
    class Solution {
    public:
        int networkDelayTime(vector<vector<int>>& times, int N, int K) {
            constexpr int MAX_TIME = 101 * 100;
            vector<vector<int>> d(N, vector<int>(N, MAX_TIME));
            
            for (auto time : times)   
                d[time[0] - 1][time[1] - 1] = time[2];
            
            for (int i = 0; i < N; ++i)
                d[i][i] = 0;
            
            for (int k = 0; k < N; ++k)
                for (int i = 0; i < N; ++i)
                    for (int j = 0; j < N; ++j)                    
                        d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
            
            int max_time = *max_element(d[K - 1].begin(), d[K - 1].end());        
            return max_time >= MAX_TIME ? - 1 : max_time;
        }
    };
    

      

    Appraoch #3: Java. [Dijkstra's Algorithm]

    class Solution {
        Map<Integer, Integer> dist;
        public int networkDelayTime(int[][] times, int N, int K) {
            Map<Integer, List<int[]>> graph = new HashMap();
            for (int[] edge : times) {
                if (!graph.containsKey(edge[0])) {
                    graph.put(edge[0], new ArrayList<int[]>());
                }
                graph.get(edge[0]).add(new int[]{edge[1], edge[2]});
            }
            dist = new HashMap();
            for (int node = 1; node <= N; ++node) {
                dist.put(node, Integer.MAX_VALUE);
            }
            dist.put(K, 0);
            boolean[] seen = new boolean[N+1];
            while (true) {
                int candNode = -1;
                int candDist = Integer.MAX_VALUE;
                for (int i = 1; i <= N; ++i) {
                    if (!seen[i] && dist.get(i) < candDist) {
                        candDist = dist.get(i);
                        candNode = i;
                    }
                }
                if (candNode < 0) break;
                seen[candNode] = true;
                if (graph.containsKey(candNode)) {
                    for (int[] info : graph.get(candNode))
                        dist.put(info[0], Math.min(dist.get(info[0]), dist.get(candNode) + info[1]));
                }
            }
            int ans = 0;
            for (int cand : dist.values()) {
                if (cand == Integer.MAX_VALUE) return -1;
                ans = Math.max(ans, cand);
            }
            return ans;
        }
    }
    

      

    Appraoch #4: Python[DFS]

    class Solution(object):
        def networkDelayTime(self, times, N, K):
            """
            :type times: List[List[int]]
            :type N: int
            :type K: int
            :rtype: int
            """
            graph = collections.defaultdict(list)
            
            for u, v, w in times:
                graph[u].append((w, v))
                
            dist = {node: float('inf') for node in xrange(1, N+1)}
            
            def dfs(node, elapsed):
                if elapsed >= dist[node]: return
                dist[node] = elapsed
                for time, nei in sorted(graph[node]):
                    dfs(nei, elapsed + time)
                
            dfs(K, 0)
            
            ans = max(dist.values())
            return ans if ans < float('inf') else -1
        
    

      

    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    安卓 Context 和 Application的关系
    Android Intent应用
    android launchmode(四种启动模式)应用场景及实例
    返回数据给上一个活动
    Intent传参数
    安卓activity生命周期
    如何将nideshop部署到本地
    navicat链接数据库错误2013
    数据库设计三大范式
    nodejs版本升级
  • 原文地址:https://www.cnblogs.com/h-hkai/p/10160581.html
Copyright © 2011-2022 走看看