最小生成树prim算法:
graph[][] 待生成树的图,
used[] 使用过的节点,
distance[] 生成树到各节点的最短距离,
start 任意起始点。
1:将 start 放入 used ,从起始点 start 遍历周边节点,将可到达的节点的距离放入 distance 。
public static void init(int[][] graph, boolean[] used, int[] distance){
int from = GraphUtils.FROM;
for (int i = 0; i < graph.length; i++){
used[i] = false;
distance[i] = graph[from][i];
}
used[from] = true;
distance[from] = 0;
}
2:在 distance 中选择没有在 used 中并且距离最小的联通点 min ,添加到 used 中。
3:遍历 min 联通的节点around,如果 graph[min][around] < distance[around] 设置 distance[around] = graph[min][around]。
注:此处可添加 sum+= min;用于计算最小生成树的路长总和。
4:循环 2,3 直到全部在 used 中。
public static int prim(int[][] graph){
boolean[] used = new boolean[graph.length];
int[] distance = new int[graph.length];
init(graph, used, distance);
int sum = 0;
for (int i = 0; i < graph.length; i++){
int min = GraphUtils.MAX;
int minIndex = GraphUtils.FROM;
for (int j = 0; j < graph.length; j++){
if ((!used[j]) && distance[j] < min){
min = distance[j];
minIndex = j;
}
}
if (min != GraphUtils.MAX) {
used[minIndex] = true;
sum += min;
LOG.d(minIndex);
for (int j = 0; j < graph.length; j++){
if ((!used[j]) && distance[j] > graph[minIndex][j]){
distance[j] = graph[minIndex][j];
}
}
}
}
return sum;
}