算法基本思想非常简单,
- 将顶点分成两个集合U与V-U
- 每次从V-U中找到距离集合U最近的点E
- 取点E与集合U的最短连接边作为生成树的一条边
- 将E放入集合U中
- 重复,直到V-U为空
可以发现,其中比较关键的一个步骤就是寻找两个集合的最短连接边,我们可以用暴力方法解决,但是开销太大,所以这里我们可以这么做
- 建立两个数组:closest与lowcost
- closest用来记录集合V-U中的元素与U的最短连接点
- lowcost用来对应最短连接的长度
- 每次从closest中选最小值,该值就是需要新添加的边长,而该点就是新加入U中的点(记作P)
- 更新lowcost与closest:遍历V-U中的点,如果E到P的距离小于之前closest中记录的E到U的距离,则E的最短连接点更新为P,响应的lowcost也更新为P-E的距离
public class Prim {
static final int N = Integer.MAX_VALUE;
public static void main(String[] args) {
int[][] map = {
{N, 23, N, N, N, 28, 36},
{23,N,20,N,N,N,1},
{N,20,N,15,N,N,4},
{N,N,15,N,3,N,9},
{N,N,N,3,N,17,16},
{28,N,N,N,17,