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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
| package com.yukinoshita.algorithm.prim;
import java.util.Scanner;
public class PrimAlgorithm { private static final int INF = Integer.MAX_VALUE;
public static void main(String[] args) { int vertexNum = 7; char[] villages = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
int[][] weight = { {INF, 7, 7, INF, INF, INF, 6}, {7, INF, INF, 9, INF, INF, 3}, {7, INF, INF, INF, 8, INF, INF}, {INF, 9, INF, INF, 7, 6, INF}, {INF, INF, 8, 7, INF, 7, 4}, {INF, INF, INF, 6, 7, INF, 4}, {6, 3, INF, INF, 4, 4, INF} };
Graph graph = new Graph(vertexNum, villages, weight);
MinTree minTree = new MinTree(); minTree.prim(graph, 6);
} }
class MinTree {
public void prim(Graph graph, int v) { boolean[] visited = new boolean[graph.vertexNum]; visited[v] = true;
int v1 = -1; int v2 = -1; int minLen = Integer.MAX_VALUE; for (int k = 0; k < graph.vertexNum - 1; k++) {
for (int i = 0; i < graph.vertexNum; i++) { for (int j = 0; j < graph.vertexNum; j++) { if (visited[i] && !visited[j] && graph.weight[i][j] < minLen) { minLen = graph.weight[i][j]; v1 = i; v2 = j; } } } System.out.println("修路:" + graph.villages[v1] + "<--" + graph.weight[v1][v2] + "-->" + graph.villages[v2]); visited[v1] = true; visited[v2] = true; minLen = Integer.MAX_VALUE;
} } }
class Graph { int vertexNum; char[] villages; int[][] weight;
Graph(int vertexNum, char[] villages, int[][] weight) { this.vertexNum = vertexNum; this.villages = villages; this.weight = weight; }
void showGraph() { for (int i = 0; i < vertexNum; i++) { for (int j = 0; j < i; j++) { if (weight[i][j] != Integer.MAX_VALUE) { System.out.println(villages[i] + "<--" + weight[i][j] + "-->" + villages[j]); } } } } }
|