日常更新数据结构
思想:通过选择一个根结点,然后遍历其所有的边,选择权重最小的一个边。然后到达相应的结点,然后再从该边出发,依旧选择权重最小的边到达下一个结点。(目的是为了使A到各个结点的权值和最小)
原图为上述图。
过程:A开始遍历AB,AC,AD。发现AD权值最小,然后选择AD,从D开始发现DF最小。。。。。。。ADC比ADFC小就用ADC
经过循环后,得到如下图所示的最小生成树。
上代码
public void minSpanTree() {
Triple[] mst = new Triple[vertexCount() - 1]; // 最小生成树的边集合,边数为顶点数n-1;
for (int i = 0; i < mst.length; i++) { // 保存首结点到各个结点的权值
mst[i] = new Triple(0, i + 1, this.weight(0, i + 1));
}
for (int i = 0; i < mst.length; i++) { // 找出A到各个结点的权值最小的那条边
int minweight = MAX_WEIGHT, min = 1;
for (int j = i + 1; j < mst.length; j++) {//找权值最小的那个
if (mst[j].value < minweight) {
minweight = mst[j].value;
min = j;
}
}
Triple edge = mst[min]; // 替换原来权值较大的那条边
mst[min] = mst[i];
mst[i] = edge;
int tv = edge.column; // 更新其他结点的权值,由于路径选择问题,其他权值也会发生该边
for (int j = i + 1; j < mst.length; j++) {
int v = mst[i].column;
int weight = this.weight(tv, v);
if (weight < mst[j].value) { //如果新权值小,则替换原权值
mst[j] = new Triple(tv, v, weight);
}
}
}
System.out.println("最小生成树的边集合为:");
int mincost = 0;
for (int i = 0; i < mst.length; i++) {
System.out.println(mst[i] + " ");
mincost += mst[i].value;
}
}