示例#1
0
        // Minimum spanning tree algorithm
        public Graph Kruskal()
        {
            // Initialization
            Graph MST = new Graph(false);

            foreach (string vertName in AdjList.Keys)
            {
                MST.AddVertex(vertName);
            }


            // disjoint sets of vertices for Kruskal's algorithm
            VertexDisjointSets Sets = new VertexDisjointSets();

            foreach (Vertex vertex in AdjList.Values)
            {
                VertexDisjointSets.Node v = new VertexDisjointSets.Node(vertex);
                Sets.MakeSet(v);
            }

            // making set of the edges and sort them
            List <Edge> edges = new List <Edge>();

            foreach (Vertex fr in AdjList.Values)
            {
                VertexDisjointSets.Node from = Sets[fr];
                foreach (KeyValuePair <Vertex, uint> t in fr.Adj)
                {
                    VertexDisjointSets.Node to = Sets[t.Key];
                    Edge e = new Edge(from, to, t.Value);
                    edges.Add(e);
                }
            }
            edges.Sort();

            // main part of alg
            foreach (Edge edge in edges)
            {
                if (Sets.FindSet(edge.from) != Sets.FindSet(edge.to))
                {
                    MST.AddEdge(edge.from.vertex.Name, edge.to.vertex.Name, edge.weight);
                    Sets.Union(edge.from, edge.to);
                }
            }

            return(MST);
        }
示例#2
0
 public Edge(VertexDisjointSets.Node f, VertexDisjointSets.Node t, uint w)
 {
     from   = f;
     to     = t;
     weight = w;
 }