网络延迟问题 - 复杂性分析

问题描述

下面是leetcode的网络延迟问题的解决方案。我已经编写了一个所有测试用例成功的解决方案。但无法分析时间复杂度。我相信它的 O(V^2 + E) 其中 V 是节点和 E 边的数量在这解决方案中,虽然我每次都添加每个节点的所有相邻节点,但如果该节点已经存在最小距离,则不会进一步处理它们。 Leetcode 问题链接 https://leetcode.com/problems/network-delay-time

   public int networkDelayTime(int[][] times,int n,int k) {
        int[] distances = new int[n+1];
        Arrays.fill(distances,-1);
        if(n > 0){
            List<List<int[]>> edges = new ArrayList<List<int[]>>();
            for(int i = 0 ; i <= n ; i++){
                edges.add(new ArrayList<int[]>());
            }
            
            for(int[] time : times){
                edges.get(time[0]).add(new int[]{time[1],time[2]});
            }
            Queue<Vertex> queue = new LinkedList<>();
            queue.add(new Vertex(k,0));
            while(!queue.isEmpty()){
                Vertex cx = queue.poll();
                int index = cx.index;
                int distance = cx.distance;
                //process adjacents only if distance is updated
                if(distances[index] == -1 || distances[index] > distance){ 
                    distances[index] = distance;
                    List<int[]> adjacents = edges.get(index);
                    for(int[] adjacent : adjacents){
                        queue.add(new Vertex(adjacent[0],adjacent[1]+distance));
                    }
                }

            }
        }
        int sum = 0;
        for(int i = 1 ; i <= n; i++){
            int distance = distances[i];
            
            if(distance == -1){
                return -1;
            }
            sum =  Math.max(sum,distance);
        }
        return sum;
    }
    
    public static class Vertex{
        int index;
        int distance;
        public Vertex(int i,int d){
            index = i;
            distance = d;
        }
    }

解决方法

您应该使用 PriorityQueue 而不是 LinkedList