Prim算法 数组实现
2017-11-27 20:01
113 查看
public class Test { public static void main(String[] args) { // TODO Auto-generated method stub // 带权路径图1 int net1[][] = { { 0, 1, 2, 3, 4, 5 }, { 1, 0, 3, 2, 0, 0 }, { 2, 3, 0, 0, 0, 6 }, { 3, 2, 0, 0, 7, 0 }, { 4, 0, 0, 7, 0, 5 }, { 5, 0, 6, 0, 5, 0 } }; // 带权路径图2 // 带权路径图2 int net[][] = { { 0, 6, 0, 0, 7, 4 }, { 6, 0, 3, 4, 0, 0 }, { 0, 3, 0, 0, 0, 2 }, { 0, 4, 0, 0, 5, 0 }, { 7, 0, 0, 5, 0, 1 }, { 4, 0, 2, 0, 1, 0 } }; net = prim(net1); for (int i = 0; i < net.length; i++) { for (int j = 0; j < net.length; j++) { System.out.print(net[i][j]+" "); } System.out.println(); } } public static int[][] prim(int net[][]) { int result[][] = new int[net.length][net.length]; int x = 0, y = 1; int set[] = new int[net.length]; // 初始化结果数组 for (int i = 0; i < net.length; i++) { for (int j = 0; j < net.length; j++) { result[i][j] = 0; } } // 将最小权值的两点放入集合 for (int i = 0; i < net.length; i++) { for (int j = i + 1; j < net.length; j++) { if (net[i][j] <= net[x][y] && net[i][j] != 0) { x = i; y = j; } } } InsertSort(set, x); InsertSort(set, y); // 更新结果数组的权值(无向) result[x][y] = net[x][y]; result[y][x] = net[y][x]; // 循环 直到set集合中点的数目达到6 while(getSetNumber(set) < 6){ // System.out.println(1); // 遍历集合中的边 获得最小权值的边 放入集合 设置result的权值 int pow = 9999; //从第一个元素开始遍历 set[k]为一个顶点的下标+1 for (int k = 0; k < getSetNumber(set); k++) { //遍历元素的边 i要还原下标 所以-1 因为在set数组中是用下标+1的方式储存 for (int i = set[k]-1; i < set.length; i++) { for (int j = 0; j < set.length; j++) { //只有不与已在集合内的元素的边(+1) 和 权值更小的边 但不为零 可以作为目标 if( !isCover(set,j+1) && net[i][j] <= pow && net[i][j] != 0){ pow = net[i][j]; // System.out.println(pow+" "+i+" "+j); x = i; y = j; } } } } //跟新集合内的元素和结果的权值 InsertSort(set, x); InsertSort(set, y); result[x][y] = net[x][y]; result[y][x] = net[y][x]; // for (int i = 0; i < set.length; i++) { // System.out.print(set[i]+" "); // } // System.out.println(); } return result; } //返回数组里非0的数字的个数 public static int getSetNumber(int[] set){ for (int i = 0; i < set.length; i++) { if(set[i] == 0) return i; if(i + 1 == set.length) return set.length; } return 0; } //判断数字n 是否在set里 public static boolean isCover(int[] set, int n) { for (int i = 0; i < set.length; i++) { if (set[i] == n) return true; } return false; } //动态增序插入一个数 如果这个数已经存在在数组中 就不插入 public static void InsertSort(int[] set, int num) { num += 1; // 数组中没有数 直接放到第一位 if (set[0] == 0) set[0] = num; else { // 如果已经有相等的数 不进行插入 for (int i = 0; i < set.length; i++) { if (num == set[i]) return; } for (int i = 0; i < set.length; i++) { // 如果插入的数小于第i个数 往后偏移一位 放在第i位 if (num < set[i]) { for (int j = set.length - 1; j > i; j--) { set[j] = set[j - 1]; } set[i] = num; return; } } // 如果插入的数大于所有数 放在最后 for (int i = 0; i < set.length; i++) { if (set[i] == 0) { set[i] = num; return; } } } } }
相关文章推荐
- prim算法构造最小生成树(邻接表和数组两种存储方式实现)
- 使用数组实现队列
- 第12周项目3——数组类运算的实现
- 【LeetCode-面试算法经典-Java实现】【026-Remove Duplicates from Sorted Array(删除排序数组中的重复元素)】
- 在一个数组中实现三个栈,并且数组未满之前栈不能溢出的问题
- 灵活使用数组制作图片切换js实现
- C语言实现动态数组(以面向对象的编程风格)
- The Second Blog -数组实现约瑟夫问题-C语言
- java实现快速排序的分割思想:在快速排序算法中,我们随机在数组中选择一个数字,然后把比选中数字小的数字都排在它前面,比选中数字大的数字都排在它的后面。
- 背包问题 动态规划 滚动数组实现
- (java 数组)队列的底层实现(望高人指点)
- 栈的数组实现
- 静态变量数组实现LRU算法
- java实现字符串转String数组的方法示例
- C++利用函数调用实现数组数据的输入输出
- 最小生成树的prim算法实现
- ASP 使用Filter函数来检索数组的实现代码
- JS函数arguments数组获得实际传参数个数的实现方法
- 选择法排序,用传递数组名来实现
- 链表的实现与数组