Java数据结构:最小生成树---Prim算法

日常更新数据结构

思想:通过选择一个根结点,然后遍历其所有的边,选择权重最小的一个边。然后到达相应的结点,然后再从该边出发,依旧选择权重最小的边到达下一个结点。(目的是为了使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;
		}
	}

猜你喜欢

转载自blog.csdn.net/qq_42192693/article/details/84934670
今日推荐