刚开始只是给g[i][j]赋值,总是出错,应该当作无向图g[i][j] = g[j][i]
import java.io.IOException;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.util.Scanner;
import java.util.Arrays;
import java.util.Formatter;
class Main
{
public static final boolean DEBUG = false;
public static void main(String[] args) throws IOException
{
Scanner cin;
int n;
if (DEBUG) {
cin = new Scanner(new FileReader("d:\\OJ\\uva_in.txt"));
} else {
cin = new Scanner(new InputStreamReader(System.in));
}
while (cin.hasNext()) {
n = cin.nextInt();
if (n == 0) break;
double[][] g = new double[n][n];
double[] x = new double[n];
double[] y = new double[n];
for (int i = 0; i < n; i++) {
x[i] = cin.nextDouble();
y[i] = cin.nextDouble();
}
for (int i = 0; i < n; i++) {
Arrays.fill(g[i], Double.MAX_VALUE);
}
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
g[i][j] = g[j][i] = Math.sqrt(Math.pow(x[i] - x[j], 2) + Math.pow(y[i] - y[j], 2));
}
}
double[] dis = new double[n];
boolean[] vis = new boolean[n];
vis[0] = true;
for (int i = 1; i < n; i++) {
dis[i] = g[0][i];
}
double ans = 0;
for (int i = 1; i < n; i++) {
double min = Double.MAX_VALUE;
int k = -1;
for (int j = 0; j < n; j++) {
if (!vis[j] && dis[j] < min) {
min = dis[j];
k = j;
}
}
if (k != -1) {
//System.out.println("k:" + k + " min:" + min);
vis[k] = true;
ans += min;
for (int j = 0; j < n; j++) {
if (!vis[j] && g[k][j] != Double.MAX_VALUE && g[k][j] < dis[j]) {
dis[j] = g[k][j];
}
}
}
}
Formatter fmt = new Formatter();
fmt.format("%.2f", ans);
System.out.println(fmt);
}
}
}