import java.util.Arrays; //最小生成树(Minimum Spanning Tree,MST)是一个图论中的概念,它是一个连通图中生成树中边权值之和最小的树 public class Test_33 { private static final int INF = Integer.MAX_VALUE; public void prim(int[][] graph) { int n = graph.length; int[] parent = new int[n]; // 存储最小生成树的父节点 int[] key = new int[n]; // 存储到每个节点的最小权值 boolean[] mstSet = new boolean[n]; Arrays.fill(key, INF); key[0] = 0; // 设置第一个节点的权值为0 parent[0] = -1; for (int i = 0; i < n - 1; i++) { int u = minKey(key, mstSet); mstSet[u] = true; for (int v = 0; v < n; v++) { if (graph[u][v] != 0 && !mstSet[v] && graph[u][v] < key[v]) { parent[v] = u; key[v] = graph[u][v]; } } } System.out.println("Edge \tWeight"); for (int i = 1; i < n; i++) { System.out.println(parent[i] + " - " + i + "\t" + graph[i][parent[i]]); } } private int minKey(int[] key, boolean[] mstSet) { int min = INF; int minIndex = -1; for (int i = 0; i < key.length; i++) { if (!mstSet[i] && key[i] < min) { min = key[i]; minIndex = i; } } return minIndex; } public static void main(String[] args) { int[][] graph = { {0, 2, 0, 6, 0}, {2, 0, 3, 8, 5}, {0, 3, 0, 0, 7}, {6, 8, 0, 0, 9}, {0, 5, 7, 9, 0} }; Test_33 primMST = new Test_33(); primMST.prim(graph); } }
java实现一个最小生成树算法
最新推荐文章于 2024-07-06 18:34:43 发布