有佬帮忙看看吗,放esclipse中就是find()函数的报错,应该是数据量太多了,找的层次太多了栈爆了吗。
package Luogu;
import java.io.*;
import java.util.*;
import java.util.stream.Collectors;
public class test01 {
static int N = 400000,n,m,k,INF = (int)1e9+7;
static int[] f = new int[N],v = new int[N],p = new int[N],save = new int[N];
static int Int(String s){return Integer.parseInt(s);}
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static PrintWriter pw= new PrintWriter(new OutputStreamWriter(System.out));
public static void main(String[] args)throws IOException{
String[] arrStr = br.readLine().split(" ");
n = Int(arrStr[0]); m = Int(arrStr[1]);k = Int(arrStr[2]);
for(int i = 1;i <= n;i++){
p[i] = i;
v[i] = 1;
}
for(int i = 1;i <= k;i++){
arrStr = br.readLine().split(" ");
int a = Int(arrStr[0]);int b = Int(arrStr[1]);
p[find(a)] = find(b);
}
for(int i = 1;i <= n;i++) {
if(p[i] != i) {
v[find(i)] += v[i];
v[i] = 0;
}
}
int cnt = 0;
for(int i = 1;i <= n;i++) {
if(p[i] != i) {
cnt ++;
save[cnt] += p[i];
}
}
for(int i = 1;i <= cnt;i++){
for(int j = 2 * m;j >= save[i] ;j --){
f[j] = Math.max(f[j - save[i]] + save[i],f[j]);
}
}
//寻找离m最近的点
int dis = INF,ans = INF;
for(int i = 1;i <= n;i++) {
if(dis > Math.abs(f[i] - m)) {
dis = Math.abs(f[i] - m);
ans = f[i];
}
}
if(ans == INF) pw.println("0");
else pw.println(ans);
pw.println();
pw.flush();br.close();pw.close();
}
static int find(int x){
if(p[x] != x) p[x] = find(p[x]);
return p[x];
}
}