• HDU 1162 Eddy's picture (最小生成树)(java版)


    Eddy's picture

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1162

        ——每天在线,欢迎留言谈论。

    题目大意:

    给你N个点,求把这N个点连在一起的最短总距离。

    思路:

    假设每两两点之间都有路径,求最小生成树。

    AC代码:(Java)

     1 import java.util.Scanner;
     2 import java.math.*;
     3 public class Main {
     4     public static final int MAXN = 110;
     5     public static double mp[][] = new double[MAXN][MAXN];
     6     public static Point p[] = new Point[MAXN]; 
     7     public static int n;
     8     public static String answer = new String();
     9     public static Scanner scn = new Scanner(System.in);
    10     public static void main(String[] args){
    11         for (int i = 0; i < MAXN; i++){
    12             p[i] = new Point();
    13         }
    14         while (scn.hasNext()) {
    15             n = scn.nextInt();
    16         foundMap();
    17         answer = String.format("%.2f", prim());
    18         System.out.println(answer);
    19         }
    20         System.exit(0);
    21     }
    22     public static boolean foundMap() {
    23         double x,y;
    24         for (int i = 0; i < n; i++) {
    25             x = scn.nextDouble();
    26             y = scn.nextDouble();
    27             p[i].setPoint(x, y);
    28         }//Found points
    29         for (int i = 0; i < n; i++)
    30             for (int j = 0; j < n; j++)
    31                 if (i != j)
    32                     mp[i][j] = Point.getDistencs(p[i], p[j]);
    33         //Found map
    34         return true;
    35     }
    36     public static double prim() {
    37         int tempI;
    38         double tempClos;
    39         double[] closEdge = new double[MAXN];
    40         double sum = 0.0;
    41         //Init closeEdge
    42         closEdge[0] = 0.0;
    43         for (int i = 1; i < n; i++) {
    44             closEdge[i] = mp[0][i];
    45         }
    46         //Find n-1 edge
    47         for (int i = 1; i < n; i++) {
    48             tempI = -1;
    49             tempClos = -1.0;
    50             for (int j = 0; j < n; j++) {
    51                 if (closEdge[j] != 0.0 && (tempClos == -1.0 || closEdge[j] < tempClos)){
    52                     tempClos = closEdge[j];
    53                     tempI = j;
    54                 }
    55             }
    56             sum += tempClos;
    57             closEdge[tempI] = 0;
    58             for (int j = 0; j < n; j++) {
    59                 if (j != tempI && closEdge[j] > mp[tempI][j]) {
    60                     closEdge[j] = mp[tempI][j];
    61                 }
    62             }
    63         }
    64         return sum;
    65     }
    66 }
    67 class Point { //已下为一个点类 可以不看。
    68     private double x;
    69     private double y;
    70     public Point(double x,double y) {
    71         this.x = x;
    72         this.y = y;
    73     }
    74     public Point() {
    75         x = 0.0;
    76         y = 0.0;
    77     }
    78     public void setPoint(double X,double Y) {
    79         this.x = X;
    80         this.y = Y;
    81     }
    82     public double getX() {
    83         return x;
    84     }
    85     public double getY() {
    86         return y;
    87     }
    88     public static double getDistencs(Point p1,Point p2) {
    89         return Math.sqrt(Math.pow(p1.getX() - p2.getX(), 2.0) + Math.pow(p1.getY() - p2.getY(),2.0));
    90     }
    91 }

    2017-07-23 13:07:39

  • 相关阅读:
    实体枚举字段注释反向生成数据库注释sql
    系统间数据存储和交互思路
    复选框与bitmap算法实践
    Entity Framework Core配置DbContext的两种方式
    C#语法糖——持续更新
    抽丝剥茧读源码——Microsoft.Extensions.Configuration(2)
    抽丝剥茧读源码——Microsoft.Extensions.Configuration(1)
    算法分享之关于atcoderbeginner166E的讲解
    关于coder168E问题的分析与解答(C语言)
    atcoder168D题
  • 原文地址:https://www.cnblogs.com/Twobox/p/7224331.html
Copyright © 2020-2023  润新知