杭电Hdu 1162 Eddy's picture

本文介绍如何使用Prim算法解决最小生成树问题,并通过示例代码展示算法实现过程。算法通过逐步选择最短边将所有节点连接起来,形成一棵最小生成树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

典型的最小生成树题,我用的prim算法,应该还有其他很多方法。

import java.util.Scanner;
public class Hdu1162 {

 public static void main(String[] args){
  Scanner sc=new Scanner(System.in);
  
  while(sc.hasNext()){
  int n=sc.nextInt();
  double [] x=new double[n];
  double [] y=new double[n];
  for(int i=0;i<n;i++){
   x[i]=sc.nextDouble();
   y[i]=sc.nextDouble();
  }//输入数据完毕
  
     double [][]distance=new double[n][n];  //用来记录各点间长度
   //计算各点之间的长度
     for(int i=0;i<n;i++){
      for(int j=0;j<n;j++){
       if(i==j){
        distance[i][j]=Double.MAX_VALUE;
       }
       else
        distance[i][j]=Math.sqrt(Math.pow(x[j]-x[i],2)+Math.pow(y[j]-y[i], 2));
      }
     }
  double sum1=prim(n,distance);
  System.out.printf("%.2f",sum1).println();
  
  }
 }
  //调用prim算法
 static double prim(int n,double[][] c){
  double[] lowcost=new double[n]; //记录当前最短路径各点距离
  int [] closet =new int [n];   //记录当前临接点
  boolean[] s=new boolean[n];   //标志数组
  //赋初值
  s[0]=true;
  for(int i=1;i<n;i++){
   lowcost[i]=c[0][i];
   closet[i]=0;
   s[i]=false;
  }
  double sum=0; //记录最短路径长度
  //从这开始处理数据
  for(int i=1;i<n;i++){
   double min=Double.MAX_VALUE;
   int j=1;//用来记录下一个临接点
   
   for(int k=1;k<n;k++){
    if(lowcost[k]<min&&!s[k]){//找出当前权值最小的
     min=lowcost[k];
     j=k; //记录下一个临接点
    }
   }
   s[j]=true;
   sum+=c[closet[j]][j];
   //从这开始更新lowcost[]数组
   for(int k=1;k<n;k++){
    if(c[j][k]<lowcost[k]&&!s[k]){
     lowcost[k]=c[j][k];
     closet[k]=j;
    }
   }
   
  }
  return sum;
  
 }
 
 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值