目录
概念
代码实现
public class PrimAlgorithm {
public static void main(String[] args) {
//测试看看图是否创建ok
char[] data = new char[]{'A','B','C','D','E','F','G'};
int vertexs = data.length;
//邻接矩阵的关系使用二维数组表示,10000这个大数,表示两个点不联通
int [][]weight=new int[][]{
{10000,5,7,10000,10000,10000,2},
{5,10000,10000,9,10000,10000,3},
{7,10000,10000,10000,8,10000,10000},
{10000,9,10000,10000,10000,4,10000},
{10000,10000,8,10000,10000,5,4},
{10000,10000,10000,4,5,10000,6},
{2,3,10000,10000,4,6,10000}};
//创建MGraph对象
MGraph graph = new MGraph(vertexs);
//创建一个MinTree对象
MinTree minTree = new MinTree();
minTree.createGraph(graph, vertexs, data, weight);
//输出
minTree.showGraph(graph);
//测试普利姆算法
minTree.prim(graph, 0);//
}
}
/**
* 创建最小生成树
*/
class MinTree{
/**
* 用于创建领接矩阵
* @param mGraph 图
* @param vertexs 节点数
* @param data 节点数据
* @param weight 边值
*/
public void createGraph(MGraph mGraph, int vertexs , char[] data, int[][] weight){
for (int i = 0; i < vertexs; i++) {
// 创建值
mGraph.data[i] = data[i];
for (int j = 0; j < vertexs; j++) {
//创建权值
mGraph.weight[i][j] = weight[i][j];
}
}
}
// 用于展示节点
public void showGraph(MGraph graph){
for (int[] val : graph.weight) {
System.out.println(Arrays.toString(val));
}
}
//编写prim算法,得到最小生成树
/**
*
* @param graph 图
* @param v 表示从图的第几个顶点开始生成'A'->0 'B'->1...
*/
public void prim(MGraph graph, int v) {
// 根据节点个数创建访问表, 用于标识已经访问的节点
boolean[] isVisible = new boolean[graph.vertexs];
int h1 = -1;// 开头节点的下标
int h2 = -1;// 结尾节点的下标
int minWeight = 10000;// 最小权值
int weight = 0; //总权值
// 从 v 节点为头, 开始访问
isVisible[v] = true;
for (int k = 1; k < graph.vertexs; k++) { // 遍历所有节点
// 遍历领接图
for (int i = 0; i < graph.vertexs; i++) {
for (int j = 0; j < graph.vertexs; j++) {
if(isVisible[i] && !isVisible[j] && graph.weight[i][j] < minWeight){
// 替换最小路径策略, 通过遍历当前 i 节点 的领接节点, 找到这些节点间的最短路径
minWeight = graph.weight[i][j];
h1 = i;
h2 = j;
}
}
}
//找到一条边是最小
System.out.println("边<" + graph.data[h1] + "," + graph.data[h2] + "> 权值:" + minWeight);
weight += minWeight;
//注意要把最小权值重新初始化, 并把找到的最小权值对应节点访问值确认
minWeight = 1000;
isVisible[h2] = true;
}
System.out.println("总权值为 = " + weight);
}
}
/**
* 创建图
*/
class MGraph{
int vertexs; // 节点数
char[] data; // 节点名称
int[][] weight; // 节点权值 -> 边值
public MGraph(int vertexs) {
this.vertexs = vertexs;
this.data = new char[vertexs];
this.weight = new int[vertexs][vertexs];
}
}