import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
//用邻接矩阵的方法构建图数据结构
class Graph{ //图类
int[] point; //顶点矩阵
int[][] edge; //边集矩阵
int numPoint; //顶点数量
int numEdeges; //边的数量
public Graph() {}
public Graph(int numPoint,int numEdeges)
{
this.numEdeges=numEdeges;
this.numPoint=numPoint;
point=new int[numPoint];
edge=new int[numPoint][numPoint];
}
//邻接矩阵的表示法
public static void createGraph1(Graph graph,int j,int k){
Scanner in=new Scanner(System.in);
for(int i=0;i<j;i++) {
System.out.println("请输入第"+(i+1)+"顶点的数据:");
graph.point[i]=in.nextInt(); //录入顶点数据
}
for(int i=0;i<j;i++) {
for(int h=0;h<j;h++)
{
graph.edge[i][h]=Integer.MAX_VALUE; //将邻接矩阵所有的边初始化为最大整数值
}
}
for(int i=0;i<k;i++) //录入所有的边值
{
System.out.println("请输入第"+(i+1)+"条边的两端顶点坐标:");
int p1=in.nextInt();
int p2=in.nextInt();
System.out.println("请输入这两个顶点之间的权值:");
int a2=in.nextInt();
graph.edge[p1][p2]=a2;
graph.edge[p2][p1]=a2;
}
}
}
public class dsd {
//实现普里姆算法的函数
public static void MiniSpanTree_prim(Graph a)
{
int min,i,j,k; //定义一些待会要用到的变量
int[] adjvex=new int[a.numPoint];
int[] lowcost=new int[a.numPoint];
lowcost[0]=0;
adjvex[0]=0;
for(i=1;i<a.numPoint;i++)
{
lowcost[i]=a.edge[0][i]; //将邻接矩阵中的第一行赋值给lowcost数组
adjvex[i]=0; //表示现在最小生成树中起点还只有0起点
}
for(i=1;i<a.numPoint;i++)
{
min=Integer.MAX_VALUE;
j=1;
k=0;
while(j<a.numPoint)
{
if(lowcost[j]!=0&&lowcost[j]<min) //lowcost[j]为0表示Vj这个顶点已经参与了最小生成树的构建
{
min=lowcost[j];
k=j;
} //这个if语句找出lowcost数组中的最小值,也就是某个顶点所连接的边的最小权值
j++;
}
System.out.println("("+adjvex[k]+","+k+")");
lowcost[k]=0; //表示Vk已经参与了最小生成树的构建
for(j=1;j<a.numPoint;j++)
{
if(lowcost[j]!=0&&a.edge[k][j]<lowcost[j])
{
lowcost[j]=a.edge[k][j];
adjvex[j]=k;
}
}
}
}
public static void main(String[] args)
{
Graph graph=new Graph(9,15);
graph.createGraph1(graph, graph.numPoint,graph.numEdeges);
MiniSpanTree_prim(graph);
}
}
最小生成树的生成算法-普里姆(prim)算法的java实现
最新推荐文章于 2024-07-31 13:29:55 发布