优化算法
package mintree;
/*
* prim算法的思想: 初始化时,v0加入到最小树,其他所有顶点作为未加入树的集合
* 取矩阵中第一横,lowcost[],其实就是v0与其他顶点的距离,找出最小的,比如v4,v4加入到最小树,此时最小数有两个节点了v0和v4
* 接下来,要找到其他未加入树顶点中与最小树顶点距离最近的那个点 lowcost[]这是v0的数据 找到v4与其他顶点的距离数据,即矩阵的第5横
* tmp[] 然后rmp[]和lowcost[]纵向对比大小,小的数据设置到lowcost[]
* 然后横向对比lowcost[]数据,找到最小点X,这个X即为与最小树距离最近的那个点 同理,依次将所有顶点加入到最小树
*/
public class Prim {
static int MAX = 65535;
public static void prim(int[][] graph, int n) {
char[] c = new char[] { 'A', 'B', 'C', 'D', 'E' };
int[] lowcost = new int[n];
int[] mst = new int[n];
int i, j, min, minId, sum = 0;
for (i = 1; i < n; i++) {
lowcost[i] = graph[0][i];//
mst[i] = 0;
}
//找出以选定开始的第一个定点为出发点的最短距离
for (i = 1; i < n; i++) {//n-1次循环,也就是查找n-1个最小边
min = MAX;
minId = 0;
for (j = 1; j < n; j++) {
if (lowcost[j] < min && lowcost[j] != 0) {//横向比较lowcost[]
min = lowcost[j];
minId = j;
}
}
System.out.println(c[mst[minId]] + "到" + c[minId] + " 权值:" + min+"......."+i);
sum = sum + min;
lowcost[minId] = 0;
for (j = 1; j < n; j++) {
if (graph[minId][j] < lowcost[j]) {//对graph[minId][j]的理解
lowcost[j] = graph[minId][j];
mst[j] = minId;
}
}
}
System.out.println("sum:" + sum);
}
public static void main(String[] args) {
int[][] map = new int[][] {
{ 0, 4, 3, MAX, MAX },
{ 4, 0, 18, MAX, MAX },
{ 3, 18, 0, 22, 5 },
{ 0, MAX, 22, 0, 9 },
{ MAX, MAX, 5, 9, 0} };
prim(map, map.length);
}
}