Example #1
0
 /// <summary>
 /// Constructeur
 /// </summary>
 /// <param name="NumberNodes"></param>
 /// <param name="NumberEdges"></param>
 public KruskalGraph(int NumberNodes, int NumberEdges)
 {
     NumberofNodes = NumberNodes;
     NumberOfEdges = NumberEdges;
     Edges = new KruskalEdge[NumberOfEdges];
     for (int i = 0; i < NumberEdges; ++i)
     {
         Edges[i] = new KruskalEdge();
     }
 }
Example #2
0
        /// <summary>
        /// Krukal 最小支撑树
        /// <remarks>
        /// 要求
        /// <list type="Dot">
        /// 无向图
        /// </list>
        /// <list type="Dot">
        /// 单连通
        /// </list>
        /// </remarks>
        /// </summary>
        public void Kruskal()
        {
            Reset();
            IPriorityQueue <KruskalEdge> edges   = BuildEdgeHeap();
            IVector <IVector <int> >     vertexs = BuildVertex();

            while (vertexs.Size != 1)
            {
                KruskalEdge edge = edges.DelMax();
                int         from = -1;
                int         to   = -1;
                for (int i = 0; i < vertexs.Size; i++)
                {
                    if (vertexs[i].Find(edge.From) != -1)
                    {
                        from = i;
                    }
                    if (vertexs[i].Find(edge.To) != -1)
                    {
                        to = i;
                    }
                }
                if (from != to)
                {
                    for (int i = 0; i < vertexs[to].Size; i++)
                    {
                        vertexs[from].Insert(vertexs[to][i]);
                    }
                    vertexs.Remove(to);
                    if (Exist(edge.From, edge.To))
                    {
                        Status(edge.From, edge.To, EStatus.Tree);
                    }
                    else
                    {
                        Status(edge.To, edge.From, EStatus.Tree);
                    }
                }
            }
        }
Example #3
0
    public static KruskalEdge[] KruskalAlg(Graph graph)
    {
        int verticesCount = graph.VerticesCount;

        Debug.Log("Vertices Count: " + verticesCount);

        KruskalEdge[] result = new KruskalEdge[verticesCount];
        int           i      = 0;
        int           e      = 0;

        Array.Sort(graph.edge, delegate(KruskalEdge a, KruskalEdge b)
        {
            return(a.Weight.CompareTo(b.Weight));
        });

        Subset[] subsets = new Subset[verticesCount];

        for (int v = 0; v < verticesCount; ++v)
        {
            subsets[v].Parent = v;
            subsets[v].Rank   = 0;
        }

        while (e < verticesCount - 1)
        {
            Debug.Log("e : " + e + "i :" + i);
            KruskalEdge nextEdge = graph.edge[i++];
            int         x        = Find(subsets, nextEdge.Source);
            int         y        = Find(subsets, nextEdge.Destination);

            if (x != y)
            {
                result[e++] = nextEdge;
                Union(subsets, x, y);
            }
        }

        return(result);
    }
Example #4
0
        /// <summary>
        /// Kruskal algorythm
        /// </summary>
        public List<KruskalEdge> KruskalMST()
        {
            //Stocke le résultat de l'algorithme
            List<KruskalEdge> result = new List<KruskalEdge>();

            //Réorganise le tableau dans l'ordre de leur poids du plus petit au plus grand
            Array.Sort(Edges);

            // Allocate memory for creating V Nodes
            KruskalNode[] subsets = new KruskalNode[NumberofNodes];
            for (int i = 0; i < NumberofNodes; ++i)
            {
                subsets[i] = new KruskalNode();
                subsets[i].Parent = i;
                subsets[i].Value = 0;
            }

            int j = 0;  // Index used to pick next edge
            int e = 0;  // An index variable, used for result[]

            // Number of edges to be taken is equal to V-1
            while (e < NumberofNodes - 1)
            {
                // Step 2: Pick the smallest edge. And increment the index
                // for next iteration
                KruskalEdge next_edge = new KruskalEdge();
                next_edge = Edges[j++];

                int x = Find(subsets, next_edge.From);
                int y = Find(subsets, next_edge.To);

                // If including this edge does't cause cycle, include it
                // in result and increment the index of result for next edge
                if (x != y)
                {
                    result.Add(new KruskalEdge());
                    result[e++] = next_edge;
                    Union(subsets, x, y);
                }
                // Else discard the next_edge
            }
            return result;
        }