1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| public class MinTree { private static int sum = 0;
public void CreateGraph(MGraph graph, int nodes, char data[], int[][] weight) { int i, j; for (i = 0; i < nodes; i++) { graph.data[i] = data[i]; for (j = 0; j < nodes; j++) { graph.weight[i][j] = weight[i][j]; } } }
public void Prim(MGraph graph, int v) { int[] visited = new int[graph.nodes]; for (int i = 0; i < graph.nodes; i++) { visited[i] = 0; }
visited[v] = 1; int h1 = -1, h2 = -1; int wineWeight = 10000; for (int k = 1; k < graph.nodes; k++) {
for (int i = 0; i < graph.nodes; i++) { for (int j = 0; j < graph.nodes; j++) { if (visited[i] == 1 && visited[j] == 0 && graph.weight[i][j] < wineWeight) { wineWeight = graph.weight[i][j]; h1 = i; h2 = j; } } }
System.out.println(graph.data[h1] + "," + graph.data[h2]); sum += wineWeight; visited[h2] = 1; wineWeight = 10000; }
}
public static void main(String args[]) { char[] data = new char[]{'1', '2', '3', '4', '5', '6'}; int nodes = data.length; int[][] weight = new int[][]{ {0, 6, 1, 5, 10000, 10000}, {6, 0, 5, 10000, 3, 10000}, {1, 5, 0, 5, 6, 4}, {5, 10000, 5, 0, 10000, 2}, {10000, 3, 6, 10000, 0, 6}, {10000, 10000, 4, 2, 6, 0} }; System.out.println("输出:\n" + "依次构成树的边为(用两个顶点表示边):"); MGraph graph = new MGraph(nodes); MinTree mt = new MinTree(); mt.CreateGraph(graph, nodes, data, weight); mt.Prim(graph, 0); System.out.print("最小权合值:" + sum);
} }
|