一.Prim算法
prim算法是用来求最小生成树的问题具体就是在一个图的n个节点找到n-1条边,使这n-1条边的权值最小
二.修路问题
在狗熊岭有如下七个村庄
村庄道路连接情况和距离如图所示
现在需要找到一个修路方法,使得每个村庄都能连通且总距离最近
思路就是假设从A开始
找到与A相连的最短村庄G
然后以A和G为起始村庄寻找与其连接最小的点
(要以访问过的点为起始点寻找未被访问过的点)
从图中看找到B
一次类推直到找到六条最小边
三.代码实现
prim算法实现
public class Graph{
private char[] vertexList;//存储顶点
private int[][] edges;//存储图
private int numberOfVertex;//顶点个数
private static int Min = 10000;//存储一个较大权值
Graph(char[] vertexList,int[][] edges,int numberOfVertex){
//初始化村庄
this.numberOfVertex = numberOfVertex;
this.edges = new int[numberOfVertex][numberOfVertex];
this.vertexList = new char[numberOfVertex];
for(int i = 0;i<numberOfVertex;i++){
this.vertexList[i] = vertexList[i];
for(int j = 0;j<numberOfVertex;j++){
this.edges[i][j] = edges[i][j];
}
}
}
public void showGraph(){
for(int[] i:edges){
System.out.println(i.toString());
}
}
public void prim(int start){
int sumPath = 0;//记录最短距离总和
boolean[] isVisit = new boolean[numberOfVertex];//存储访问信息
isVisit[start] = true;
int x = -1;
int y = -1;
for(int k = 1;k<numberOfVertex;k++){//一共有n-1条边,循环n-1次
int minPath = Min;
for(int i = 0;i<numberOfVertex;i++){
for (int j = 0;j<numberOfVertex;j++){
if(isVisit[i]&&!isVisit[j]&&edges[i][j]<minPath){
//更新最短路径
minPath = edges[i][j];
//xy记录距离i最近的村庄j的下标
x = i;
y = j;
}
}
}
System.out.println("<"+vertexList[x]+","+vertexList[y]+">"+",权值:"+edges[x][y]);//输出修路情况
sumPath += edges[x][y];
isVisit[y] = true;//将以及访问过的节点记录
}
System.out.println("最短路径:"+sumPath);
}
}
测试
public static void main(String[] args) {
char[] vertex = {'A','B','C','D','E','F','G'};//七个村庄
int[][] weigth = {
{Min,5,7,Min,Min,Min,2},
{5,Min,Min,9,Min,Min,3},
{7,Min,Min,Min,8,Min,Min},
{Min,9,Min,Min,Min,2,Min},
{Min,Min,8,Min,Min,5,4},
{Min,Min,Min,4,5,Min,6},
{2,3,Min,Min,4,6,Min}
};//村庄联通关系
Graph graph = new Graph(vertex,weigth,vertex.length);//图
graph.prim(1);
}