最小生成树的生成算法-普里姆(prim)算法的java实现

在这里插入图片描述

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);
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值