最小生成树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);
}
}
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);
}
}
相关文章推荐
- 创业维艰---分享创业中遇到的困难
- 创建表空间及用户赋予表空间权限
- 查询词提示系统的简单实现
- 伪逆矩阵
- hadoop_cluser
- Android的核心包括几部分
- 选择排序
- Error:Execution failed for task ':app:processDebugResources'.
- Spring中将一个对象数据显示在前端的列表中
- cvc-complex-type.2.4.c 错误的修改
- python exp()
- 交换排序
- 常规功能和模块自定义系统 (cfcmms)—016模块字段的定义
- 可拖拽GridView代码解析
- Android Studio混淆打包配置
- 【笨木头Unity】入门之旅010(完结):Demo之四处找死(五)_UI
- 创业没有寒冬 心定方得始终
- [Python Fabric] [SSH] Mac OS X 10.9 + Vagrant虚拟环境使用Python Fabric进行SSH远程登录的简单实验
- Android之Paint属性介绍
- 第11条:谨慎地覆盖clone