技术标签: 算法
package Leetcode;
public class Prim {
static int[][] map= {
{999,5,6,4,999,999},
{5,999,1,2,999,999},
{6,1,999,2,5,3},
{4,2,2,999,999,4},
{999,999,5,999,999,4},
{999,999,3,4,4,999}
}; //用来存储矩阵,其中map[0][0]=999代表A----->A不可达, map[0][1]=5代表A---->B的距离为5,以此类推 ,。。。。。。。
static int[]book = new int[6]; //用来记录已经选择的点
static int[]dist = new int[6]; //用来存储到当前到各点的最小距离
public static void main(String[] args) {
int start = 0; //从点A开始
book[start]=1; //选中A以后,将A记录
System.out.println((char) (start+65)); //从A开始所以先输出A
for(int i=0;i<6;i++)
{
dist[i] = map[0][i]; //查找从A可以到达的点,记录他们的距离,为了找距离的最小值
}
for(int i=1;i<6;i++) //因为总共有6个点,我们已经选择了一个点(A),所以这里循环5次就行了,
{
int min = 999; //设置为999,是为了求最小值,这里不多做解释
for(int j=0;j<6;j++) //查找当前点可以到达的点
{
if(book[j]==0 && min>dist[j]) //如果这个点没有被选择过,并且最小值 要小于 当前距离,则更新最小值,然后更新当前节点
{
min = dist[j];
start = j;
}
}
book[start]=1; //此时,当前节点已经选好了,那么我们把该节点记录一下,防止重复选择
System.out.println((char) (start+65)); //输出当前节点
for(int k=0;k<6;k++) //更新距离,因为此时已经记录了超过1个节点了,所有我们需要重新替换dist数组
{
if(book[k]==0 && dist[k]>map[start][k]) //如果当前点没有选择过,并且现如今新的距离要小于旧的距离,则替换。
{
dist[k] = map[start][k];
}
}
}
}
}
...
...
1.主要思想 2.图示 3.代码实现 1.图 2.最小生成树 3.入口...
Prim算法 Prim算法,每一步都会为一颗生长中的树添加一条边。一开始这棵树只有一个顶点,然后哦会向它添加V-1条边,每次总是将下一条连接树的顶点与不在树中且权重最小的边加入树中 实现 最小生成树的延迟实现 通过一个队列保存最小生成树的边(横切边) Queue mst 一个最小优先队列保存所有的边 MinPQ pq 通过删除最小边来得到新的最小生成树的边,通过基于堆的最小优先队列来实现 一个数组...
...
...
http://ac.jobdu.com/problem.php?pid=1024...
最近上机,实验里老师布置让写用kruskal算法实现,目标明确 可是最后实现的时候,发现我的想法竟然是prim算法 现在写完了,才发现写错了 不过还是想把它发表出来 要不然就没有人知道我曾经写过 呜呜呜~~~...
最小生成树的Prim算法 java实现 看的其它大佬的代码 在这记录一下 方便复习...