package demo28;
import java.util.Arrays;
//普利姆算法解决最小生成树问题
public class smallTree {
public static void main(String[] args) {
char[] data = new char[]{'A', 'B', 'C', 'D', 'E', 'F', 'G'};
int verx = data.length;
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}
};
Graph graph = new Graph(verx);
MinTree minTree = new MinTree();
minTree.creatTree(graph, verx, data, weight);
//演示
minTree.showGraph(graph);
//测试
minTree.Plm(graph, 0);
}
}
//创建树
class MinTree {
//创建图的邻接矩阵
public void creatTree(Graph graph, int verx, char[] data, int[][] weight) {
int i = 0, j = 0;
for (i = 0; i < verx; i++) {
graph.data[i] = data[i];
for (j = 0; j < verx; j++) {
graph.weight[i][j] = weight[i][j];
}
}
}
//显示tu
public void showGraph(Graph graph) {
for (int[] ints : graph.weight) {
System.out.println(Arrays.toString(ints));
}
}
//普利姆算法
//verx表示从哪个顶点开始访问
public void Plm(Graph graph, int verx) {
//创建一个一维数组标记是否被访问
int[] visited = new int[graph.verx];
//初始化
for (int i = 0; i < graph.verx; i++) {
visited[i] = 0;
}
//将初始顶点标记为已经访问
visited[verx] = 1;
int minKey = 10000;//将minKey初始化为一个大数
//定义两个值记录下标
int h1 = -1;
int h2 = -1;
for (int k = 1; k < graph.verx; k++) { //因为有n-1条边,所以需要循环这么多次
for (int i = 0; i < graph.verx; i++) {
for (int j = 0; j < graph.verx; j++) {
if (visited[i] == 1 && visited[j] == 0 && graph.weight[i][j] < minKey) {
//替换minKey,记录最小边的权值
minKey = graph.weight[i][j];
h1 = i;
h2 = j;
}
}
}
System.out.println("<" + graph.data[h1] + "," + graph.data[h2] + "> 权值为: " + minKey);
//将其标记为已经访问
visited[h2] = 1;
//将minKey重新设置为最大值
minKey = 10000;
}
}
}
//创建图
class Graph {
int verx;//表示图的顶点个数
char[] data;//存放节点数据
int[][] weight;//存放边
//初始化
public Graph(int verx) {
this.verx = verx;
data = new char[verx];
weight = new int[verx][verx];
}
}
普利姆算法-最短路径问题
最新推荐文章于 2024-07-11 21:13:07 发布