普利姆算法主要是寻找图的最小生成树,最小生成树自己百度啦直接看普利姆算法的工作流程啊
假设我们从A点开始生成最小生成树
A的邻边为 : (A-C)[7] (A-G)[2] (A-B)[5]
1. 从邻边中删选最小权值的结点,将其加入生成树, 所以我们就有两个节点 (A, G)
2. 从(A, G)整体子图的邻边中筛选出一个最小权值节点
(A-C)[7] (G-E)[4] (G-B)[3] (G-F)[6]
3. 选出是B节点, 将其加入生成树 ,所以现在是 (A,B,G)三个节点了
4. 从(A, B, G) 子图的邻边中选出一个最小权值节点, 加入生成树
…
下面看java代码
import java.util.Arrays;
import java.util.Scanner;
public class Prim {
private static Graph g = new Graph(9, 15);
public static void main(String[] args) {
prim_a(0);
}
// start表示从哪一个顶点开始
public static void prim_a(int start){
int[] pre = new int[g.vertiesNum];// 记录下一个节点的上一个节点
int[] data = new int[g.vertiesNum];// 巨鹿各边的权值
// 现在要找下一个节点
// 1. pre中全部赋值为start -> 下一个节点是从start找到的
// 1. data中全部为start直接相连的边的权值
for(int i = 0; i < g.vertiesNum; i++){
pre[i] = start;
data[i] = g.map[start][i];
}
data[start] = 0; // data[i] = 0表示i节点已经加入到最小生成树中
//要找n -1 条边 循环n-1次
for(int i = 1; i < g.vertiesNum; i++){
// 从data数组找最小的权值
int min = 65560;
int index = 0;
for(int j = 0; j < g.vertiesNum; j++){
// 已经加入生成树的节点就不需要了
if(data[j] != 0 && min > data[j]){
min = data[j];
index = j;
}
}
data[index] = 0; //将这个找到的节点加入生成树
System.out.println("("+ g.verties[pre[index]] +", " + g.verties[index]+ ")");
// 将刚才找到的节点 跟之前所有找到的节点作为整体, 更新data数组和pre数组
for(int j = 0; j < g.vertiesNum; j++){
if(data[j] != 0 && g.map[index][j] < data[j]){
data[j] = g.map[index][j];
pre[j] = index;
}
}
}
}
}
class Graph{
String[] verties; // 顶点集合
int[][] map; // 邻接矩阵
int vertiesNum; // 顶点数目
int edgeNums; // 边的树数目
public Graph(int vertiesNum, int edgeNums){
this.vertiesNum = vertiesNum;
this.edgeNums = edgeNums;
int i = 0;
verties = new String[vertiesNum];
map = new int[vertiesNum][vertiesNum];
Scanner scan = new Scanner(System.in);
System.out.println("请输入顶点, 空格隔开");
String vertiesLine = scan.nextLine();
for(String v: vertiesLine.split(" ")){
verties[i++] = v;
}
for(i = 0; i < vertiesNum; i++){
Arrays.fill(map[i], 65560);
map[i][i] = 0;
}
System.out.println("请输入变信息");
for(int j = 0; j < edgeNums; j++){
String[] next = scan.nextLine().trim().split(" ");
int x = Integer.parseInt(next[0]);
int y = Integer.parseInt(next[1]);
int quan = Integer.parseInt(next[2]);
map[x][y] = quan;
map[y][x] = quan;
}
scan.close();
}
}