最小生成树-普里姆算法-java实现

  • 最小生成树:是将图中的顶点全部连通,但是其权值之和要求最小


  
  
  1. /**
  2. * 最小生成树:两种方式,普里姆算法和克鲁斯卡尔算法
  3. * @author timmy1
  4. *
  5. */
  6. public class MinSpanTree {
  7. int[][] matrix;// 矩阵
  8. int MAX_WEIGHT = Integer.MAX_VALUE;
  9. int size;// 顶点个数
  10. /**
  11. * 普里姆算法实现最小生成树:先初始化拿到第一个顶点相关联的权值元素放到数组中-》找到其中权值最小的顶点下标-》再根据该下标,将该下标顶点相关联的权值加入到数组中-》循环遍历处理
  12. */
  13. public void prim(){
  14. int[] tempWeight = new int[size];// 临时存放顶点权值的数组,每次循环都要从中获取到最小权值和顶点下标
  15. int minWeight;//最小权值
  16. int minId;//最小权值顶点
  17. int sum = 0;//权值总和
  18. //先初始化将第一行的顶点权值存放到临时权值数组中
  19. for(int i =0;i<size;i++){
  20. tempWeight[i] = matrix[0][i];
  21. }
  22. PrintUtil.print("从顶点0开始查找");
  23. for(int i=1;i<size;i++){
  24. //每次循环都找出临时顶点权值的最小的权值
  25. minWeight = MAX_WEIGHT;
  26. minId = 0;
  27. for(int j=1;j<size;j++){
  28. if(tempWeight[j] >0 && tempWeight[j]<minWeight){
  29. minWeight = tempWeight[j];
  30. minId = j;
  31. }
  32. }
  33. //找到目标顶点minId,他的权值为minweight。
  34. PrintUtil.print("找到顶点:"+minId+" 权值为:"+minWeight);
  35. sum+=minWeight;
  36. //根据找到的顶点minid,将这一行的所有相关联的顶点权值添加到临时权值数组中
  37. tempWeight[minId] = 0;
  38. for(int j = 1;j<size;j++){
  39. if(tempWeight[j] != 0&& matrix[minId][j]<tempWeight[j]){
  40. tempWeight[j] = matrix[minId][j];
  41. }
  42. }
  43. }
  44. PrintUtil.print("最小权值总和为:"+sum);
  45. }
  46. private void createGraph(int index) {
  47. size = index;
  48. matrix = new int[index][index];
  49. int[] a0 = { 0, 10, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 11, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT };
  50. int[] a1 = { 10, 0, 18, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 16, MAX_WEIGHT, 12 };
  51. int[] a2 = { MAX_WEIGHT, MAX_WEIGHT, 0, 22, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 8 };
  52. int[] a3 = { MAX_WEIGHT, MAX_WEIGHT, 22, 0, 20, MAX_WEIGHT, 24, 16, 21 };
  53. int[] a4 = { MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 20, 0, 26, MAX_WEIGHT, 7, MAX_WEIGHT };
  54. int[] a5 = { 11, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 26, 0, 17, MAX_WEIGHT, MAX_WEIGHT };
  55. int[] a6 = { MAX_WEIGHT, 16, MAX_WEIGHT, 24, MAX_WEIGHT, 17, 0, 19, MAX_WEIGHT };
  56. int[] a7 = { MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 16, 7, MAX_WEIGHT, 19, 0, MAX_WEIGHT };
  57. int[] a8 = { MAX_WEIGHT, 12, 8, 21, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 0 };
  58. matrix[0] = a0;
  59. matrix[1] = a1;
  60. matrix[2] = a2;
  61. matrix[3] = a3;
  62. matrix[4] = a4;
  63. matrix[5] = a5;
  64. matrix[6] = a6;
  65. matrix[7] = a7;
  66. matrix[8] = a8;
  67. }
  68. public static void main(String[] args) {
  69. MinSpanTree graph = new MinSpanTree();
  70. graph.createGraph(9);
  71. graph.prim();
  72. }
  73. }

打印结果:

从顶点0开始查找

找到顶点:1 权值为:10

找到顶点:5 权值为:11

找到顶点:8 权值为:12

找到顶点:2 权值为:8

找到顶点:6 权值为:16

找到顶点:7 权值为:19

找到顶点:4 权值为:7

找到顶点:3 权值为:16

最小权值总和为:99



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值