Пример #1
0
        /// <summary>
        /// 获取图中的边放到 EdgeData[]中,后面要遍历该数组
        /// </summary>
        /// <returns></returns>
        public EdgeData[] GetEdges()
        {
            int index = 0;

            EdgeData[] edgeDatas = new EdgeData[edgeNum];
            for (int i = 0; i < vertexs.Length; i++)
            {
                for (int j = i + 1; j < vertexs.Length; j++)
                {
                    if (matrix[i, j] != INF)
                    {
                        edgeDatas[index++] = new EdgeData(vertexs[i], vertexs[j], matrix[i, j]);
                    }
                }
            }
            var temp = edgeDatas.ToList();

            temp.Sort();
            return(temp.ToArray());
        }
Пример #2
0
        //克鲁斯卡尔算法
        public void Kruskal()
        {
            int index = 0;                 //结果数组索引

            int[] ends = new int[edgeNum]; //记录 已有最小生成树 的每个顶点的终点

            //结果数组
            EdgeData[] rets = new EdgeData[edgeNum];

            //原始图中所有边的集合
            EdgeData[] edges = GetEdges();//已经按权重排序了

            //遍历edge数组加入结果数组,判断是否构成回路
            for (int i = 0; i < edgeNum; i++)
            {
                //获取起点
                int p1 = GetPosition(edges[i].start);
                //获取终点
                int p2 = GetPosition(edges[i].end);

                //获取p1在已有最小生成树中的终点
                int m = GetEnd(ends, p1);
                //获取p2在已有最小生成树中的终点
                int n = GetEnd(ends, p2);

                //判断是否构成回路
                if (m != n)
                {
                    ends[m]       = n;        //设置m 在已有最小生成树中的终点
                    rets[index++] = edges[i]; //有一条边加入结果数组
                }
            }

            //输出rets数组
            Print(rets);
        }