涉及到的要点
Prim算法、最小生成树、图的邻接矩阵
问题描述
代码实现
package algorithm;
import java.util.Arrays;
/**
*
* @Description Prim算法解决修路总厂最小的问题
* @author ningqian QQ:2587658527
* @version
* @date 2021年3月23日下午10:30:20
*/
public class PrimAlgorithm {
public static void main(String[] args) {
int num = 7;// 假设有7个顶点
char[] data = { 'A', 'B', 'C', 'D', 'E', 'F', 'G' };// 每个节点的值用一个字符标识
int[][] weight = // 10000表示两个节点之间没有直接链路
{ { 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 } };
// 查看图的邻接矩阵
MinCostSpinningTree tree = new MinCostSpinningTree();
Graph graph = tree.createGraph(num, data, weight);
tree.showGraph(graph);
// 测试Prim算法
tree.prim(graph, 1);
}
}
//创建一个最小生成树
class MinCostSpinningTree {
// 根据已知创建连通图
public Graph createGraph(int num, char[] data, int[][] weight) {
Graph graph = new Graph(num);
for (int i = 0; i < num; i++) {
graph.data[i] = data[i];
for (int j = 0; j < num; j++) {
graph.weight[i][j] = weight[i][j];
}
}
return graph;
}
// 查看图的邻接矩阵
public void showGraph(Graph graph) {
System.out.println("图的邻接矩阵为:");
for (int[] line : graph.weight) {
System.out.println(Arrays.toString(line));
}
}
// 利用Prim算法计算最小生成树
// v表示从第几个节点开始生成
public void prim(Graph graph, int v) {
int vertexNum = graph.vertexNum;// 获取节点个数
int[] visited = new int[vertexNum];// 0:未被访问 1已被访问
visited[v] = 1;// 先将开始节点置为已访问
int minPath;// 表示最小权重的边
int h1 = -1;// 记录找到节点的下标
int h2 = -1;// 记录找到节点的下标
for (int k = 1; k < vertexNum; k++) {// 共要选择vertexNum-1条边
minPath = 10000;
for (int i = 0; i < vertexNum; i++) {// 遍历所有节点查找哪些节点是已被访问的节点
for (int j = 0; j < vertexNum; j++) {// 遍历所有节点查找哪些节点是未被访问的节点
if (visited[i] == 1 && visited[j] == 0 && graph.weight[i][j] < minPath) {
minPath = graph.weight[i][j];
h1 = i;
h2 = j;
}
}
}
visited[h2] = 1;// 找到一条边后,将新加入的节点置为已访问
System.out.println("找到第 " + k + " 条边");
System.out.println("从 " + graph.data[h1] + " 到 " + graph.data[h2] + " , 权重为:" + minPath);
}
}
}
//创建一个图,构建一个框架
class Graph {
int vertexNum;// 表示顶点的个数
char[] data;// 存放每个顶点的数据
int[][] weight;// 邻接矩阵,每个顶点和其他顶点的连通关系及权重
// 构造器
public Graph(int num) {
vertexNum = num;
data = new char[num];
weight = new int[num][num];
}
}