代码实现:
package DataStructure;
public class PrimDemo {
public static void main(String[] args) {
Graph2 graph = new Graph2(7);
String[] vertexS = {"A", "B", "C", "D", "E", "F", "G"};
for (String vertex : vertexS) {
graph.insertVertex(vertex);
}
// A-B(5) A-C(7) A-G(2) B-D(9) B-G(3) C-E(8) D-F(4) E-G(4) E-F(5) F-G(6)
// 100表示不连通
int[][] weights = {
{100, 5, 7, 100, 100, 100, 2},
{5, 100, 100, 9, 100, 100, 3},
{7, 100, 100, 100, 8, 100, 100},
{100, 9, 100, 100, 100, 4, 100},
{100, 100, 8, 100, 100, 5, 4},
{100, 100, 100, 4, 5, 100, 6},
{2, 3, 100, 100, 4, 6, 100}
};
graph.insertEdge(weights);
primMinTree(graph, 0);
/* output:
A-G 权值:2
G-B 权值:3
G-E 权值:4
E-F 权值:5
F-D 权值:4
A-C 权值:7
*/
}
/**
* 普里姆算法计算最小生成树
* @param graph 原始带权图
* @param index 从哪个顶点开始
*/
public static void primMinTree(Graph graph, int index) {
// 获取顶点个数vertexNum
int vertexNum = graph.getVertexNum();
// 记录顶点是否被访问过
int[] isVisited = new int[vertexNum];
// 设置开始顶点为已访问
isVisited[index] = 1;
// 最小权值初始化为100
int minWeight = 100;
// v1 v1记录顶点下标
int v1 = -1;
int v2 = -1;
// 循环vertexNum-1次,每次计算出一条边,总共vertexNum-1条边。
for (int k = 1; k < vertexNum; k++) {
// 遍历所有已访问顶点,并找出已访问顶点与所有与其连通的未访问顶点的最小权值
for (int i = 0; i < vertexNum; i++) {
for (int j = 0; j < vertexNum; j++) {
if (isVisited[i] == 1 && isVisited[j] == 0 && graph.getEdges()[i][j] < minWeight) {
minWeight = graph.getEdges()[i][j];
v1 = i;
v2 = j;
}
}
}
isVisited[v2] = 1;
System.out.println(graph.getVertex(v1) + "-" + graph.getVertex(v2) + " 权值:" + minWeight);
minWeight = 100;
}
}
}
class Graph2 extends Graph {
public Graph2(int n) {
super(n);
}
public void insertEdge(int[][] edges) {
this.edges = edges;
}
}