最小生成树算法是指在一个无向加权图中,找出一棵权值最小的生成树。常见的解决方案有两种:Prim算法和Kruskal算法。
Prim算法
Prim算法是一种贪心算法,它从一个任意的起点开始,逐渐扩展生成树中的节点。在每次扩展时,选择与生成树相连的边中,权值最小的那条边,并将其加入生成树中。
下面是Prim算法的Java实现:
import java.util.*;
public class Prim {
public static List<int[]> minimumSpanningTree(int[][] graph) {
int n = graph.length;
boolean[] visited = new boolean[n];
PriorityQueue<int[]> queue = new PriorityQueue<>(Comparator.comparingInt(e -> e[1]));
queue.offer(new int[] {0, 0});
List<int[]> edges = new ArrayList<>();
while (!queue.isEmpty() && edges.size() < n - 1) {
int[] edge = queue.poll();
int u = edge[0], w = edge[1];
if (!visited[u]) {
visited[u] = true;
edges.add(edge);
for (int v = 0; v < n; v++) {
if (graph[u][v] != 0 && !visited[v]) {
queue.offer(new int[] {v, graph[u][v]});
}
}
}
}
return edges;
}
}