Prim最小生成树算法
适用情况
以点为主线贪心搜索,适合与稠密图。
时间复杂度为 O()
思想
①【初始化(最短距离)】将所有的点分成两个集合,一个是已经被选上的点集(默认有一个起始点);另一个是待选点集。用一个数组存源点到其他所有点的最短距离(即最小花费)
②【找最近点】循环 n-1 次(用上所有的点找最小的花费)找点的时候,每次从没被选上的点集中找到一个点,该点满足是到被选上点集中最近的一个点,记录下来并放入选上的点集中。
③【更新最短距离】然后循环所有的点,从未被选上的点集中更新最短距离,即让源点到循环的点(该点未被选上),且经过刚找到的点距离最近(花费最少)。
public class Solution {
static final int N = 1005;
static int n, m;
static int[][] map = new int[N][N]; //记录两点之间连通的花费
private static void Prim(int s) {
int[] lowcost = new int[N]; //记录源点s到每个点的最小花费
boolean[] vis = new boolean[N];
for(int i=1; i<=n; i++) {
lowcost[i] = map[s][i]; //初始化源点 s 到 i 点的距离
}
for(int i=0; i<n-1; i++) {
int minx = Integer.MAX_VALUE;
int p = -1;
for(int j=1; j<=n; j++) {
if(!vis[j] && lowcost[j] < minx) {
minx = lowcost[j];
p = j;
}
}
if(p == -1)
break;
vis[p] = true;
for(int j=1; j<=n; j++) {
if(!vis[j] && lowcost[j] > map[p][j]) {
lowcost[j] = map[p][j];
}
}
}
}
}
如有错误或不合理的地方,敬请指正~
加油!!