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); }
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); }