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()); }
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(); } }