求解思路:
1.创建图;
2.prime;找出每次的最短路径
代码:
package com;
public class Graph {
int verxs; //表示图的结点的个数
char[] data; //表示各个结点的值
int [][]weight; //存放边
public Graph(int verxs){
this.verxs=verxs;
data=new char[verxs];
weight=new int[verxs][verxs];
}
}
创建图并遍历
//生成图
public void createGraph(Graph graph,int versx,char[] data,int [][]weight){
int i,j;
for(i=0;i<versx;i++){
graph.data[i]=data[i];
for(j=0;j<versx;j++){
graph.weight[i][j]=weight[i][j];
}
}
}
//显示图,即临界矩阵
public void show(Graph graph) {
for(int []a:graph.weight){
System.out.println(Arrays.toString(a));
}
}
prime算法:
//Prime算法
public void prime(Graph graph,int v){
//visited[]:标记结点是否被访问过
int []visited=new int[graph.verxs];
//默认是0,表示没有被访问过
for(int i=0;i<graph.verxs;i++){
visited[i]=0;
}
//把当前节点标记为已访问
visited[v]=1;
//h1和h2记录两个两个顶点的下标
int h1=-1;
int h2=-1;
int minWeight=100; //将minWeight初始化成一个大数,后面遍历时,会替换掉
//边数比点数少1
for(int k=1;k<graph.verxs;k++){
//确定每一次生成的作图和那个接地那距离最近
for(int i=0;i<graph.verxs;i++){
for(int j=0;j<graph.verxs;j++){
if(visited[i]==1&&visited[j]==0&&graph.weight[i][j]<minWeight){
minWeight=graph.weight[i][j];
h1=i;
h2=j;
}
}
}
//找到最小的一条边
System.out.println(graph.data[h1]+"->"+graph.data
[h2]+"权值:"+minWeight);
//将当前这个节点标记为已经访问
visited[h2]=1;
minWeight=100;
}
}
3.测试 :
public static void main(String[] args) {
char[] data={'A','B','C','D','E','F','G'};
int verxs=data.length;
int[][]weight={
//100表示两点之间不连通
{100,5,7,100,100,100,2},
{5,100,100,9,100,100,3},
{7,100,100,100,8,100,100},
{100,9,100,100,100,4,100},
{100,100,8,100,100,5,4},
{100,100,100,4,5,100,6},
{2,3,100,100,4,6,100}
};
Graph graph=new Graph(verxs);
MIniTree mIniTree=new MIniTree();
mIniTree.createGraph(graph,verxs,data,weight);
mIniTree.show(graph);
System.out.println("--------------");
mIniTree.prime(graph,0);
}