最小生成树(Prim算法)

Java实现Prim算法

 1 package com.java;
 2 import java.util.*;
 3 
 4 /**
 5  * 普里姆算法—Prim算法
 6  * 算法思路:将图中所有的顶点分为两类:树顶点(已被选入生成树的顶点)和非树顶点(还未被选入生成树的顶点)。
 7  * 1)首先选择任意一个顶点加入生成树;
 8  * 2)接下来要找出一条边添加到生成树,这需要枚举每一个树顶点到每一个非树顶点所有的边,然后找到最短边加入到生成树;
 9  * 3)按照此方法重复n-1次,直到将所有顶点都加入到生成树中。
10  */
11 
12 public class Prim {
13     static int MAX = Integer.MAX_VALUE;
14 
15     public static void main(String[] args) {
16         int[][] map = new int[][] {
17                 { 0, 2, 14, 1},
18                 { 2, 0, 5, MAX},
19                 { 14, 5, 0, 8},
20                 { 1, MAX, 8, 0}};
21         prim(map, map.length);
22     }
23     public static void prim(int[][] graph, int n){
24 
25         char[] c = new char[]{'A','B','C','D'};
26         int[] lowcost = new int[n];  //到新集合的最小权
27         int[] mid= new int[n];//存取前驱结点的下标
28         List<Character> list=new ArrayList<Character>();//用来存储加入到生成树结点
29         int i, j, min, minid , sum = 0;
30         //初始化辅助数组
31         for(i=1;i<n;i++)
32         {
33             lowcost[i]=graph[0][i];
34             mid[i]=0;
35         }
36         //加入第一个根节点
37         list.add(c[0]);
38         //加入其他的n-1个节点
39         for(i=1;i<n;i++)
40         {
41             min=MAX;
42             minid=0;
43             //每次找到距离集合最近的点
44             for(j=1;j<n;j++)
45             {
46                 if(lowcost[j]!=0&&lowcost[j]<min)
47                 {
48                     min=lowcost[j];
49                     minid=j;
50                 }
51             }
52             if(minid==0) return;
53             //将找到的最小值的节点加入到生成树
54             list.add(c[minid]);
55             //加入生成树后的节点值设为0
56             lowcost[minid]=0;
57             sum+=min;
58             System.out.println(c[mid[minid]] + "到" + c[minid] + " 权值:" + min);
59             //加入该点后,更新其它点到集合的距离
60             for(j=1;j<n;j++)
61             {
62                 if(lowcost[j]!=0&&lowcost[j]>graph[minid][j])
63                 {
64                     lowcost[j]=graph[minid][j];
65                     mid[j]=minid;
66                 }
67             }
68         }
69         System.out.println("最小生成树的权值为sum=" + sum);
70 
71     }
72 }

 

转载于:https://www.cnblogs.com/weijuanran/p/Prim.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值