做了很多其他题,学习了一番,再回头看这道题,找出了很多可以优化的地方:
1. 对象Main d 可以去掉 pre[]和Find()可以用static静态调用,效果会更快。(快了5分)
2.可以新定义一个Edge类,使用结构化的方法来存储数据。List<Edge> list 来代替原来的ms数组,因为list中存储的是结构化的数据Edge的对象成员,调用起来会比原来二维数组ms要快。 (快了15分)
更新完是90分:代码如下:
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
class Edge implements Comparable<Edge>{
int s,e,length;
Edge(int a,int b,int c){
s = a;
e = b;
length = c;
}
public int compareTo(Edge o) {
return this.length - o.length;
}
}
public class Main{
static List<Edge> list = new ArrayList<Edge>();
static int[] pre;
public static int Find(int x){
int fx = x;
while(pre[fx] != fx){
fx = pre[fx];
}
int i = x,j;
while(pre[i]!=fx){
j = pre[i];
pre[i] = fx;
i = j;
}
return fx;
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
// int[][] ms = new int[m][3];
int a,b,c;
for (int i = 0; i < m; i++) {
// for (int j = 0; j < 3; j++) {
// ms[i][j] = sc.nextInt();
//
// }
a = sc.nextInt();
b = sc.nextInt();
c = sc.nextInt();
list.add(new Edge(a,b,c));
}
// Main d = new Main();
pre = new int[n+1];
for (int i = 0; i <pre.length; i++) {
pre[i] = i;
}
// Arrays.sort(ms, new Comparator<int[]>(){
// public int compare(int[] o1, int[] o2) {
// return o1[2]-o2[2];
// }
// } );
Collections.sort(list);
int ans = 0;
for (int i = 0; i < list.size(); i++) {
// for (int i = 0; i < m; i++) {
// int x = d.Find(ms[i][0]);
// int y = d.Find(ms[i][1]);
int x = Find(list.get(i).s);
int y = Find(list.get(i).e);
int length = list.get(i).length;
if(x<y)
pre[y]=x;
else
pre[x]=y;
if(ans<length) ans = length;
if(Find(n)==1) break;
}
System.out.println(ans);
}
}
以前的case如下:————————————————————————————————
代码:
import java.util.Comparator;
import java.util.Arrays;
import java.util.Collection;
import java.util.Scanner;
public class Main{
int[] pre;
public int Find(int x){
int fx = x;
while(pre[fx] != fx){
fx = pre[fx];
}
int i = x,j;
while(pre[i]!=fx){
j = pre[i];
pre[i] = fx;
i = j;
}
return fx;
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[][] ms = new int[m][3];
for (int i = 0; i < m; i++) {
for (int j = 0; j < 3; j++) {
ms[i][j] = sc.nextInt();
}
}
Main d = new Main();
d.pre = new int[n+1];
for (int i = 0; i < d.pre.length; i++) {
d.pre[i] = i;
}
Arrays.sort(ms, new Comparator<int[]>(){
public int compare(int[] o1, int[] o2) {
return o1[2]-o2[2];
}
} );
int ans = 0;
for (int i = 0; i < ms.length; i++) {
int x = d.Find(ms[i][0]);
int y = d.Find(ms[i][1]);
if(x<y)
d.pre[y]=x;
else
d.pre[x]=y;
if(ans<ms[i][2]) ans = ms[i][2];
if(d.Find(n)==1) break;
}
System.out.println(ans);
}
}
发现只能得到70分,超时严重? ——然而用C++同样的方法不超时
想办法改进
Java中运算性能:http://churchchen86.iteye.com/blog/2279130
不知道为什么 别人用对象跑出来的比我还要快点?
JAVA版:http://blog.csdn.net/YANG_Gang2017/article/details/71893237
而且当我把Main。d 改了 不用对象演算 结果还慢了?(被扣了5分)
同理的C++写出来的是可以跑满分的 很难:
C++版:http://blog.csdn.net/dream_never_giveup/article/details/67637488#comments