您的位置:首页 > 其它

最小生成树Prim

2015-11-18 08:31 435 查看
优化算法

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
;
int[] mst = new int
;
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);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: