package orgexamplefind;import eduprincetoncsalgs4StdIn;import javaioFileReader;import javaioIOException;import javautilScanner;public class UnionFind private int id; private int count; publi
在这段代码中,有几个问题需要注意:
-
文件路径问题:代码中使用的文件路径是绝对路径,这可能会导致在其他计算机上无法找到文件。建议使用相对路径或将文件放在可访问的位置。
-
异常处理问题:在
main方法中使用了throws IOException声明,但没有实际处理IOException。建议使用try-catch块来处理可能的异常。 -
输入问题:代码中使用了
StdIn类来读取输入,但实际上并没有使用到该类。建议删除相关的导入和代码。 -
循环中的输出问题:在
union方法的循环中,通过System.out.println打印了一些调试信息,这可能会干扰输出结果。建议将这些打印语句删除或注释掉。 -
循环条件问题:在
union方法的循环中,通过id[i] == id[number1]来判断是否需要更新id[i],但实际上这可能会导致错误的结果。应该使用find方法来判断是否需要更新。 -
类命名问题:
UnionFind类的命名不够清晰,可以考虑更具体的命名,例如QuickFind或QuickUnion。
综上所述,修正后的代码如下所示:
package org.example.find;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
public class QuickFind {
private int[] id;
private int count;
public QuickFind(int N) {
count = N;
id = new int[N];
for (int i = 0; i < N; i++)
id[i] = i;
}
public int count() {
return count;
}
public boolean connected(int number1, int number2) {
return find(number1) == find(number2);
}
public int find(int number) {
return id[number];
}
public void union(int number1, int number2) {
if (connected(number1, number2))
return;
int root1 = find(number1);
int root2 = find(number2);
for (int i = 0; i < id.length; i++) {
if (id[i] == root1) {
id[i] = root2;
}
}
count--;
}
public static void main(String[] args) {
String filename = "tinyUF.txt"; // 相对路径或绝对路径
try {
Scanner sc = new Scanner(new FileReader(filename));
int N = sc.nextInt();
QuickFind quickFind = new QuickFind(N);
while (sc.hasNext()) {
int number1 = sc.nextInt();
int number2 = sc.nextInt();
if (quickFind.connected(number1, number2))
continue;
quickFind.union(number1, number2);
System.out.println(number1 + " " + number2);
}
System.out.println(quickFind.count() + " components");
sc.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
``
原文地址: https://www.cveoy.top/t/topic/hUuA 著作权归作者所有。请勿转载和采集!