示例#1
0
        public override MinimumTree miniGeneralTree_Kruskal()
        {
            int[] vnodeset = new int[NodesCount];     //存放定点联通情况
            for (int i = 0; i < vnodeset.Length; i++) //初始化V集合为空
            {
                vnodeset[i] = i;
            }

            GraphEdge[] edges = AllEdges;
            Sort <GraphEdge> .MergeSort(edges); //对边排序

            int edgeidx = 0;                    //边的索引
            int curMiniTreeEdgeCount = 0;

            MinimumTree tree = new MinimumTree();

            List <GraphEdge> selectededges = new List <GraphEdge>();

            while (curMiniTreeEdgeCount < NodesCount - 1)
            {
                var starnodetidx = _nodes[edges[edgeidx].StartNode.Name];
                var Endnodetidx  = _nodes[edges[edgeidx].EndNode.Name];

                int setidx1 = vnodeset[starnodetidx];
                int setidx2 = vnodeset[Endnodetidx];

                if (setidx1 != setidx2)
                {
                    selectededges.Add(edges[edgeidx]);
                    curMiniTreeEdgeCount++;
                    for (int i = 0; i < NodesCount; i++)
                    {
                        if (vnodeset[i] == setidx2)
                        {
                            vnodeset[i] = setidx1;
                        }
                    }
                }

                edgeidx++;
            }

            tree.Add(selectededges);

            return(tree);
        }
示例#2
0
        public override MinimumTree miniGeneralTree_Prim(int nodeidx)
        {
            if (nodeidx < 0 || nodeidx >= NodesCount)
            {
                return(null);
            }

            double[] mini_costs = new double[NodesCount]; //到最小生成树最小代价
            int[]    node_v     = new int[NodesCount];    //最小生成树顶点
            int[]    edge_n     = new int[NodesCount];    //最短边

            for (int i = 0; i < NodesCount; i++)
            {
                mini_costs[i] = double.MaxValue; //Max代表不连通
                node_v[i]     = 0;               //0代表当前未放入最小生成树中
                edge_n[i]     = -1;              //当前i节点的最短路径是和谁产生的
            }

            MinimumTree tree = new MinimumTree();

            node_v[nodeidx] = 1; //初始顶点放入最小生成树中

            tree.Add(new MinimumTreeNode {
                Cost = 0, Name = _nodesarray[nodeidx].Name, ParentName = string.Empty
            }, "");

            for (int i = 0; i < NodesCount; i++)
            {
                double cost = getWeight(nodeidx, i);
                if (cost >= 0)
                {
                    mini_costs[i] = cost;
                    edge_n[i]     = nodeidx;
                }
            }

            for (int i = 0; i < NodesCount; i++)
            {
                double minCost = double.MaxValue;
                int    minIdx  = -1;
                for (int j = 0; j < NodesCount; j++) //找当前最小节点
                {
                    if (mini_costs[j] < minCost && node_v[j] == 0)
                    {
                        minIdx  = j;
                        minCost = mini_costs[j];
                    }
                }

                if (minIdx < 0) //没找着,继续
                {
                    continue;
                }

                node_v[minIdx] = 1; //加入最小生成树
                tree.Add(new MinimumTreeNode {
                    Cost = minCost, Name = _nodesarray[minIdx].Name, ParentName = _nodesarray[edge_n[minIdx]].Name
                }, _nodesarray[edge_n[minIdx]].Name);

                for (int j = 0; j < NodesCount; j++) //更新当前最小生成树到其他节点的最小代价
                {
                    if (node_v[j] == 0)
                    {
                        double cost = getWeight(minIdx, j);
                        if (cost >= 0 && cost < mini_costs[j]) //更新到最小生成树的代价和边
                        {
                            mini_costs[j] = cost;
                            edge_n[j]     = minIdx;
                        }
                    }
                }
            }

            return(tree);
        }