public int NetworkDelayTime(int[][] times, int N, int K)
        {
            var graph = new Dictionary <int, List <Node> >();

            foreach (var edge in times)
            {
                if (!graph.ContainsKey(edge[0]))
                {
                    graph.Add(edge[0], new List <Node>());
                }
                graph[edge[0]].Add(new Node(edge[2], edge[1]));
            }

            var pq = new MinPriorityQueue();

            pq.Insert(new Node(0, K));

            var distances = new Dictionary <int, int>();

            while (pq.Size() > 0)
            {
                var node = pq.DeleteMin();
                if (distances.ContainsKey(node.Target))
                {
                    continue;
                }

                distances.Add(node.Target, node.Distance);
                if (graph.ContainsKey(node.Target))
                {
                    foreach (var edge in graph[node.Target])
                    {
                        if (!distances.ContainsKey(edge.Target))
                        {
                            pq.Insert(new Node(node.Distance + edge.Distance, edge.Target));
                        }
                    }
                }
            }

            if (distances.Count != N)
            {
                return(-1);
            }
            return(distances.Values.Max());
        }
Esempio n. 2
0
        public Kruskal(EdgeWeightedGraph <TVertex, TWeight> graph, WeightedEdge <TVertex, TWeight> initialMst)
        {
            if (graph == null)
            {
                throw new ArgumentNullException(nameof(graph));
            }

            var edges = new MinPriorityQueue <WeightedEdge <TVertex, TWeight> >(graph.EdgeNumber);

            foreach (var edge in graph.Edges)
            {
                if (!edge.Equals(initialMst))
                {
                    edges.Add(edge);
                }
            }

            var mst = new UnionFind <TVertex>(graph.Vertices);

            MinimumSpanningTree = new List <WeightedEdge <TVertex, TWeight> >(graph.VertexNumber - 1);
            if (initialMst != null)
            {
                var vertex1 = initialMst.GetVertex();
                var vertex2 = initialMst.GetTheOtherVertex(vertex1);
                mst.Union(vertex1, vertex2);
                MinimumSpanningTree.Add(initialMst);
            }

            while (!edges.IsEmpty && MinimumSpanningTree.Count < graph.VertexNumber - 1)
            {
                var edge    = edges.DeleteMin();
                var vertex1 = edge.GetVertex();
                var vertex2 = edge.GetTheOtherVertex(vertex1);
                if (!mst.IsConnected(vertex1, vertex2))
                {
                    mst.Union(vertex1, vertex2);
                    MinimumSpanningTree.Add(edge);
                }
            }

            if (MinimumSpanningTree.Count < graph.VertexNumber - 1)
            {
                throw new ArgumentException();
            }
        }