コード例 #1
0
ファイル: Graph.cs プロジェクト: mingtong/LearnLeetCode
        public void AddEdge(WeightedEdge edge)
        {
            int v = edge.EitherEdge();
            int w = edge.OtherEdge(v);

            adjacency[v].Add(edge);
            adjacency[w].Add(edge);
            edgeCount++;
        }
コード例 #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();
            }
        }
コード例 #3
0
ファイル: WeightedEdge.cs プロジェクト: FelixFan1122/LeetCode
 public int CompareTo(WeightedEdge <TVertex, TWeight> other) => Weight.CompareTo(other.Weight);