/// <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()); }
//克鲁斯卡尔算法 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); }