今天在学习prim 和 kruskal的同时,也要清楚这两个算法的区别所在。学习两种最小生成树算法
prim算法精讲
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int vertices = input.nextInt();
int edges = input.nextInt();
int[][] adjacencyMatrix = new int[vertices + 1][vertices + 1];
for (int i = 0; i <= vertices; i++) {
Arrays.fill(adjacencyMatrix[i], 10001);
}
for (int i = 0; i < edges; i++) {
int from = input.nextInt();
int to = input.nextInt();
int weight = input.nextInt();
adjacencyMatrix[from][to] = weight;
adjacencyMatrix[to][from] = weight;
}
int[] minDistances = new int[vertices + 1];
Arrays.fill(minDistances, 10001);
boolean[] inTree = new boolean[vertices + 1];
for (int i = 1; i < vertices; i++) {
int current = -1;
int minDistance = Integer.MAX_VALUE;
for (int j = 1; j <= vertices; j++) {
if (!inTree[j] && minDistances[j] < minDistance) {
minDistance = minDistances[j];
current = j;
}
}
inTree[current] = true;
for (int j = 1; j <= vertices; j++) {
if (!inTree[j] && adjacencyMatrix[current][j] < minDistances[j]) {
minDistances[j] = adjacencyMatrix[current][j];
}
}
}
int sum = 0;
for (int i = 2; i <= vertices; i++) {
sum += minDistances[i];
}
System.out.println(sum);
input.close();
}
}
kruskal算法精讲
import java.util.*;
class Edge {
int l, r, val;
Edge(int l, int r, int val) {
this.l = l;
this.r = r;
this.val = val;
}
}
public class Main {
private static int n = 10001;
private static int[] father = new int[n];
public static void init() {
for (int i = 0; i < n; i++) {
father[i] = i;
}
}
public static int find(int u) {
if (u == father[u]) return u;
return father[u] = find(father[u]);
}
public static void join(int u, int v) {
u = find(u);
v = find(v);
if (u == v) return;
father[v] = u;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int v = scanner.nextInt();
int e = scanner.nextInt();
List<Edge> edges = new ArrayList<>();
int result_val = 0;
for (int i = 0; i < e; i++) {
int v1 = scanner.nextInt();
int v2 = scanner.nextInt();
int val = scanner.nextInt();
edges.add(new Edge(v1, v2, val));
}
edges.sort(Comparator.comparingInt(edge -> edge.val));
init();
for (Edge edge : edges) {
int x = find(edge.l);
int y = find(edge.r);
if (x != y) {
result_val += edge.val;
join(x, y);
}
}
System.out.println(result_val);
scanner.close();
}
}