UVa 10397 - Connect the Campus

来源:互联网 发布:python 下载股票数据 编辑:程序博客网 时间:2024/06/04 19:55
/*UVa 10397 - Connect the Campus  * 把已存在的边权设为0 然后使用Kruscal算法 求最小生成树 * */import java.util.Arrays;import java.util.Comparator;import java.util.Scanner;class Edge {int u;// 边的起点int v;// 边的终点double w;// 边的权重;public Edge(int u, int v, double w) {this.u = u;this.v = v;this.w = w;}}class EdgeComparator implements Comparator<Edge> {@Overridepublic int compare(Edge o1, Edge o2) {if (o1.w < o2.w)return -1;else if (o1.w > o2.w)return 1;return 0;}}class Main {static final int MAXN = 760;Edge[] e = new Edge[MAXN * MAXN];int[] p = new int[MAXN * MAXN];double[][] w = new double[MAXN][MAXN];int[] x = new int[MAXN];int[] y = new int[MAXN];public static void main(String[] args) {Scanner scanner = new Scanner(System.in);Main mm = new Main();while (scanner.hasNext()) {int n = scanner.nextInt();for (int i = 1; i <= n; i++) {mm.x[i] = scanner.nextInt();mm.y[i] = scanner.nextInt();}for (int i = 1; i <= n; i++) {for (int j = 1; j <= i; j++) {if (i != j)mm.w[i][j] = mm.w[j][i] = mm.getLength(i, j);}}int m = scanner.nextInt();for (int i = 0; i < m; i++) {int u = scanner.nextInt();int v = scanner.nextInt();mm.w[u][v] = mm.w[v][u] = 0;}int index = 0;for (int i = 1; i <= n; i++) {for (int j = i + 1; j <= n; j++) {mm.e[index++] = new Edge(i, j, mm.w[i][j]);}}for (int i = 0; i <= n * n; i++) {// 并查集初始化mm.p[i] = i;}double ans = 0;Arrays.sort(mm.e, 0, index, new EdgeComparator());// 按边权排序for (int i = 0; i < index; i++) {int x = mm.find(mm.e[i].u);//起点int y = mm.find(mm.e[i].v);//终点if (x != y) {// 如果不在同一个集合就合并ans += mm.e[i].w;mm.p[x] = y;}}System.out.printf("%.2f\n", ans);}}private double getLength(int i, int j) {double m = Math.pow(x[i] - x[j], 2);double n = Math.pow(y[i] - y[j], 2);return Math.sqrt(m + n);}private int find(int x) {if (p[x] == x)return x;return p[x] = find(p[x]);}}
原创粉丝点击