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
HDU 1162 Eddy's picture (最小生成树)(java版)
时间: 2024-10-05 02:52:53